[PyKDE] dir(QtObjectThing) -> give_me_all_attrs(QtObjectThing)?

Phil Thompson phil at riverbankcomputing.co.uk
Fri May 30 18:57:00 BST 2003


On Friday 30 May 2003 5:36 pm, Gerard Vermeulen wrote:
> On Thu, 29 May 2003 18:47:46 +0100
>
> Phil Thompson <phil at riverbankcomputing.co.uk> wrote:
> > On Wednesday 28 May 2003 6:37 pm, Kasper Souren wrote:
> > > Hi,
> > >
> > > I wonder whether there is a simple trick to get all the existing
> > > attributes? Now a dir(QtObjectThing) just gives a very limited number
> > > of attributes. When exploring PyQy (and PyQwt) it would be a great help
> > > when there was a simple way to just see the possible methods. Without
> > > resorting to the manual, that is ;)  When working in Python I usually
> > > just hack around and use my TAB key a lot (in order to get possible
> > > completions).
> > >
> > > Once an object's method is used it does appear in dir(the_object). So I
> > > hope there is a possibility to have a little function that could
> > > 'trigger' the possible attributes...
> > >
> > > Having this automatically would be even cooler, but I guess that that
> > > would already have been done if it were easy... And, I hope not but,
> > > maybe the same counts for the little hackish function I have in mind.
> >
> > I'm afraid it's a feature. Without this feature PyQt would take too long
> > to load and take up too much memory.
>
> Adding the following function to each class is sufficient, I think:
> class QwtWheel: QwtSliderBase
> {
> %HeaderCode
> #include <qwt_wheel.h>
> %End
>
> public:
>     void getLazyMethodNames();
> %MemberCode
>     if (sipParseArgs(&sipArgsParsed, sipArgs, "")) {
>         int i, n;
>
>         Py_BEGIN_ALLOW_THREADS
>         n = sipClassAttrTab_$C.la_nrmethods;
>         Py_END_ALLOW_THREADS
>
>         PyObject *result = PyList_New(n);
>         if (!(result))
>             return 0;
>
>         for (i=0; i<n; i++)
>             PyList_SetItem(
>                 result,
>                 i,
>                
> PyString_FromString(sipClassAttrTab_$C.la_methods[i].ml_name) );
>
>         return result;
>     }
> %End
>
>     QwtWheel(QWidget * /TransferThis/ = 0, const char * = 0);
>     ...
>     ...
> };
>
> With such a function in each class, it will take a few lines of Python code
> to adapt the rlcompleter module so that it sees the lazy method names while
> they are not yet activated.
>
> Phil, are you willing to adapt sip so that it will generate a function like
> this for each class? That will save me some cut&paste work :-)

Interesting. You can avoid the cut&paste by using /AutoGen/, but I think a 
better solution is to implement a function in the sip module...

import sip

names = sip.getLazyMethodNames(QwtWheel)

At the moment the sip module doesn't contain any functions, but the reason it 
was changed from a library to a module was to allow these sorts of dirty 
hacks to be added without polluting PyQt etc.

So, tell me exactly what you want - or is the above all that's needed?

Phil




More information about the PyQt mailing list