What do Python IDEs use for the member drop-down?

tbrianedgar at yahoo.com tbrianedgar at yahoo.com
Fri Feb 8 07:28:30 CET 2008


I realize in the new style, getattr and setattr are supposed to
reference something in a base class, but here is what I'm trying to
do:

class tryit:
    def __init__(self, a, b):
        self.__dict__["a"] = a
        self.__dict__["b"] = b
    def __dir__(self):
        return [ "geta", "getb" ]
    def __getattr__(self, attr):
        if attr == "geta":
            return self.__dict__["a"]
        elif attr == "getb":
            return self.__dict__["b"]
        else:
            raise AttributeError

x = tryit(1, 2)

So, I'm OK with the fact that x.a, x.b, x.geta, and x.getb all work (I
don't care too much about hiding a and b).  What I would like is for
the Python IDE drop-down to include geta and getb as choices, which I
thought would be accomplished by overloading __dir__.  Am I just using
the wrong IDE (tried PythonWin from ActivePython so far)?  Do I need
to overload something else?

Whenever people ask me for help, I usually want to know "so what are
you trying to do?"  Here goes.  I'm trying to create a base C struct
class where the creator of the derived class can provide a simple "C
struct" definition, and the necessary information will be loaded into
class instances.  Something like this totaly contrived example:

class file_header(c_struct):
    definition_text = """
        typedef struct file_header  // little endian align 32
error_if_pad
        {
            uint32 LengthInBytes;
            uint8   Revision;
            uint8   Reserved;
            uint16 Encoding;
        } file_header; """
    def __init__(self, BinaryData = ""):
        c_struct.__init__(self, BinaryData)

Header = file_header( File.read(sizeof(file_header)) )
if Header.LengthInBytes > 9:   # The IDE gives me my members as
choices!!
    HappyWithLength()
else:
    Header.LengthInBytes = 9  # Again, nice drop-down from IDE
Header.Encoding = NewEncoding( File )
Header.GUITreeControlEdit()
OutFile.write( Header.GetBinaryData() )

Thanks for any suggestions!

-Brian



More information about the Python-list mailing list