[Tutor] call a def/class by reference

alan.gauld@freenet.co.uk alan.gauld at freenet.co.uk
Fri Sep 30 09:44:02 CEST 2005


>>On Thursday 29 September 2005 22:26, Alan G wrote:
>>> string -> function mapping directly.
>>>
>>> Its not usually a very useful thing to do
>>
>This is precisely how shared libraries under linux and IIRC DLLs in
>windows work. cf dlopen, dysym in C. 

No, its completely different. These are not  done at the language 
level but are implemented in the OS using an explicit mapoping 
table built as part of the shared library creation process. That is 
the language builds a dictionary of the string-function mapping. 
It is not a feature of any of the languages used for building the 
libraries.

>using "nm".
>>
>>eg:
>># nm libpython2.4.so|head -20
>>         U abort@@GLIBC_2.0
>>000dfea0 d abs_doc
>>0001fcf0 t abstract_get_bases
>>0001fe20 t abstract_issubclass

Yres but those names are not typed in  as strings to call 
the functions rather they are uised by the programmer 
to access the functions through the library.

>>Obviously, ctypes does much the same thing. 

but again by using/building mapping tables, ctypes is written 
in C and Python neither of which provides a string-function 
mapping. And ctypes is not exactly a commmon application type! 

>>try: 	 
>>    from ctypes import * 	 
>>    libc = cdll.LoadLibrary("/lib/libc.so.6") 	 
>>    sched_yield = libc.sched_yield
>> except ImportError: 	 

>>try:
>>   import functions as libc
>>   sched_yield = getattr(libc, "sched_yield")
>>                               # this is of course effectively
>equivalent to:
>>                               #   sched_yield = libc.sched_yield

Yes, but getattr is simply looking up a dictionary which had 
to be built by ctypes to start with - which is what the OP didn't 
want to do... My argument was not that this was something 
you'd never want to do just that its not something normally 
supported by languages because its an unusual thing 
to do - developers are unusual people, they do unusual things :-)

And of course if you want to delve into the innards of Python 
you can pretty much do what was requested using the builtin 
dictyionary/module mechanisms, but its not a simple \
mechanism and not recommended for general applications use...


Alan G



More information about the Tutor mailing list