How do I call anonymous classes from imported modules?

James Stroud jstroud at mbi.ucla.edu
Mon Aug 20 00:30:23 EDT 2007


JoeSox wrote:
> On 8/19/07, James Stroud <jstroud at mbi.ucla.edu> wrote:
>> Quick and dirty (you could also use a try: except:):
>>
>> f = __import__(module_name)
>> for anobj in f.__dict__.values():
>>   if hasattr(anobj, 'do_foobar'):
>>     anobj.do_foobar()
>>
>> Note that this does not test whether anobj is a class as this would
>> entail a type-check, which hints to poor design.
> 
> Thanks for the help.  The __dict__.values() is something I have not
> previously looked into but it does not work as desired because python
> wants an instance of the class.  How can I cast an object if I don't
> know what type of object it is (example.ticker, in this debug)?
> 
>>>> modname = sensorsList[0].__name__
>>>> m = __import__(modname)
>>>> for anobj in m.__dict__.values():
> 	if hasattr(anobj, 'do_foobar'):
> 		anobj.do_foobar()
> 
> 		
> Traceback (most recent call last):
>   File "<pyshell#76>", line 3, in ?
>     anobj.do_foobar()
> TypeError: unbound method do_foobar() must be called with ticker
> instance as first argument (got nothing instead)

This was the poor design I was hinting to. do_foobar is type-checking 
for ticker. "Casting" as you might think of it does not exist in python. 
Creating new objects based on the values of existing objects (lets call 
it "conversion" for lack of a better name) does (e.g. int(2.0)). But 
this is not casting. Unless you have the power to re-author all of the 
do_foobar()s to not type-check, you should create an instance of ticker 
and pass that:

t = ticker(param1, param2, parametc)
[...]
               anobj.do_foobar(t)

The "got nothing instead" means that you should have passed an 
argument--and unfortunately whoever authored do_foobar() type-checked 
for a ticker, which is not a desirable way to design an API.

James



More information about the Python-list mailing list