Python2.2 doesn't give members of a list

Andrew Dalke dalke at acm.org
Fri Aug 10 06:36:38 EDT 2001


Guido:
>The docs for dir() are very vague; code depending on a particular
>behavior must necessarily be built on observation.  For example, I'm
>not particularly concerned with breaking pydoc or PyChecker -- these
>are apps that heavily rely on introspection, and their authors were
>aware that they were walking on thin ice.  It's easy enough to fix
>these.
>
>I'd really like to see how people are using dir() in code that would
>break if it suddenly started to return all attributes; what kind of
>harm could be done?

I wrote one application similar to pydoc (acutually based off of Ping's
earlier code).  It uses dir two places.  They are:

 dir(module) -> list of elements in the module

and in a routine called 'superdir' which gets all of the class
methods and attributes:

def superdir(klass):
  klasses = [klass]
  terms = {}
  while klasses:
    klass = klasses[0]
    klasses = klasses[1:]
    for name in dir(klass):
      terms[name] = 1
    klasses.extend(list(klass.__bases__))
  names = terms.keys()
  names.sort()
  return names

As far as I can tell, none of the changes you mention will
change any of this code.

I also have access to one of my client's code base.  They use
'dir' precisely once in the whole system, which is for a function
called 'help' which works like the new pydoc.help command.  The
specific code is:

  if type(obj) == ModuleType:
     print "The following functions, classes, constants etc. are available "
\
           "in this module:"
     print
     list = []
     for name in dir(obj):
       if name[0:2] != "__":
         list.append(_describe(obj.__dict__[name], name))
     list.sort()
     for item in list:
       print item
     print "-" * 78

Again, since this works on a module and not a class, it will not
be affected by any of these changes to dir().  Besides, I expect
them to migrate to use pydoc's help command, so this will all
go away.

>If this is really unacceptable, [...]

I agree with Paul Boddie when he said:
> I was initially surprised that dir(object) didn't give
> the methods as well as the attributes, and disappointed that
> dir(object.__class__) doesn't state the methods available on that
> object.

I know I get annoyed when I'm trying to figure out what an
object does and I do a sequence like

dir(obj)
dir(obj.__class__)
obj.__class__.__bases__
dir(obj.__class__.__bases__[0])

(while all the time being thankful for readline support)

So I would like to change dir() to implement (quoting Guido again)
> How about making dir() incompatible in the other direction, and
> letting it return a sorted list of *all* attributes (that one can
> reasonably deduce)?

as that's is easier for people to use while also not likely to
break much existing code.

(I presented Python at a bioinformatics conference a couple weeks
ago.  One of the advantages I mentioned of Python was introspection
in the interactive mode, so you could puzzle some things out even if
there wasn't documentation.  I did omit describing that things
become a bit tricker with more complicated classes.  Ooops.  So
you wouldn't like them to think of me as overpromting Python,
would you?  ;)

Alex:
> That would be wonderful, but I think it would still require a
> from __future__ for one release.

Turning it around, another possibility is

from __past__ import dir

I am not proposing this - I only think it's cute, and works
fine because dir() is only a function, not a variable->keyword
change like yield.

                    Andrew
                    dalke at dalkescientific.com






More information about the Python-list mailing list