On Tue, 13 Nov 2012 07:54:32 +0000, Some Developer wrote: > On 13/11/2012 07:19, Steven D'Aprano wrote: >> On Tue, 13 Nov 2012 06:38:31 +0000, Some Developer wrote: >> >>> I'm trying to find a way to get a string of the module path of a >>> class. >>> >>> So for instance say I have class Foo and it is in a module called >>> my.module. I want to be able to get a string that is equal to this: >>> "my.module.Foo". I'm aware of the __repr__ method but it does not do >>> what I want it to do in this case. >>> >>> Can anyone offer any advice at all? >> py> from multiprocessing.pool import Pool py> repr(Pool) >> "<class 'multiprocessing.pool.Pool'>" >> >> Seems pretty close to what you ask for. You can either pull that string >> apart: >> >> py> s = repr(Pool) >> py> start = s.find("'") >> py> end = s.rfind("'") >> py> s[start+1:end] >> 'multiprocessing.pool.Pool' >> >> or you can construct it yourself: >> >> py> Pool.__module__ + '.' + Pool.__name__ 'multiprocessing.pool.Pool' >> >> > Yeah I considered doing it this way but was wary of that method because > of possible changes to the implementation of the __repr__ method in the > upstream code. If the Django developers don't consider the __repr__ > method a public API then it could change in the future breaking my code.
I didn't call SomeClass.__repr__. That is an implementation detail of SomeClass, and could change. I called repr(SomeClass), which calls the *metaclass* __repr__. That is less likely to change, although not impossible. If you're worried, just use the second way: SomeClass.__module__ + '.' + SomeClass.__name__ > Of course this might not happen but I was hoping that there was a more > generic way of doing it that did not rely on a certain implementation > being in existence. SomeClass.__name__ is the official way to get the name of a class; SomeClass.__module__ is the official way to get the name of the module or package it comes from. -- Steven -- http://mail.python.org/mailman/listinfo/python-list