
mark florisson, 14.11.2011 12:55:
On 14 November 2011 08:18, Stefan Behnel wrote:
"Martin v. Löwis", 13.11.2011 21:46:
I'm asking specifically because I'd like to properly implement __file__ in Cython modules at module init time.
Why do you need to implement __file__? Python will set it eventually to its correct value, no?
Well, yes, eventually. However, almost all real world usages are at module init time, not afterwards. So having CPython set it after running through the module global code doesn't help much.
Perhaps Cython could detect use of __file__ at module scope (if this package context function is not available), and if it's used it tries to use something akin to imp.find_module(__name__) to find the path to the file and set __file__ manually.
It's problematic. Depending on the import hooks that are in use, a second search for the already loaded but not yet instantiated module may potentially trigger a second try to load it. And if the module is already put into sys.modules, a second search may not return a helpful result. Also, running a full import of "imp" along the way may have additional side effects, and the C-API doesn't have a way to just search for the path of a module.
Would this be feasible for python < 3.3?
It would certainly not be more than a work-around, but it could be made to work "well enough" in many cases. I'd definitely prefer having something that really works in both 2.7.x and 3.3+ over a half-baked solution in all of Py2.x. Stefan