Finding the name of a class

Thomas Philips tkpmep at hotmail.com
Thu May 13 07:32:17 EDT 2004


I had exactly the same problem, and was given the __name__ solution by
members of this newsgroup. I then posted a bug report to Sourceforge,
and got a reply from Python's maintainer's: the inability of
dir(object) to display __name__ is not a bug, but a natural
consequence of the way dir()is implemented. The responses to my bug
report follow:

Thomas Philips
--------------------------------------------------------------------------------
Date: 2004-05-11 22:55
Sender: fdrake
Logged In: YES 
user_id=3066

I'm not convinced that attributes dynamically provided by
__getattr__() aren't actual attributes; it would be best if dir()
reported them if they're available via getattr(ob, name).  Whether or
not this is practical is another matter.

I've just closed documentation bug #952212, so at least the presence
of the __name__ attribute on types and classes is mentioned somewhere.

I'm re-classifying this bug report, since the dynamic behavior of
dir() is not a documentation issue.
 

--------------------------------------------------------------------------------

Date: 2004-05-02 15:47
Sender: montanaro
Logged In: YES 
user_id=44345

After a message from the submitter, it's apparent he was referring to
class objects not showing '__name__' attributes in dir() output. This
is a case of an attribute not being visible to dir() because it's not
directly present in the object's __dict__ and is trapped at evaluation
time by __getattr__().  Short of hacking dir() or adding a special
attribute ("__attributes__"?) to objects which have __getattr__()
methods I don't see a way around this problem.

Wasn't there discussion of such an attribute which would expose such
dynamic attributes to dir()?  I don't see anything in the
implementation of PyObject_Dir().

 

--------------------------------------------------------------------------------

Date: 2004-05-01 21:02
Sender: montanaro
Logged In: YES 
user_id=44345

Are you sure that the object has an actual __name__ attribute (and not
something computed by a __getattr__ method)?

>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__',
'__stderr__', '__stdin__', '__stdout__', '_getframe', 'api_version',
'argv', 'builtin_module_names', 'byteorder', 'call_tracing',
'callstats', 'copyright', 'displayhook', 'exc_clear', 'exc_info',
'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit',
'exitfunc', 'getcheckinterval', 'getdefaultencoding',
'getdlopenflags', 'getfilesystemencoding', 'getrecursionlimit',
'getrefcount', 'hexversion', 'maxint', 'maxunicode', 'meta_path',
'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform',
'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags',
'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin',
'stdout', 'version', 'version_info', 'warnoptions']
>>> sys.__name__
'sys'



More information about the Python-list mailing list