Bra*_*mon 5 python python-import
给定一个类或函数,有没有办法找到最初定义它的模块的完整路径?(即使用def xxx或class xxx.)
我知道有sys.modules[func.__module__].但是,如果func是在一个包中导入__init__.py,那么sys.modules只需重定向到那个__init__.py,因为就我的理解而言,该函数已被引入该命名空间.
一个具体的例子:
>>> import numpy as np
>>> import sys
>>> np.broadcast.__module__
'numpy'
>>> sys.modules[np.broadcast.__module__]
<module 'numpy' from '/Users/brad/.../site-packages/numpy/__init__.py'>
Run Code Online (Sandbox Code Playgroud)
显然,broadcast没有定义__init__.py; 它只是带进命名空间中的一个,这些 from module import *语句.
很高兴看到源np.broadcast中的定义位置(无论文件扩展名是什么,不管是.c还是.py).这可能吗?
你的理解:
但是, if
func是在包的 中导入的__init__.py,那么sys.modules将简单地重定向到 that__init__.py,因为据我的理解,该函数已被引入该名称空间。
是错的。__init__.py导入一个东西对该东西没有影响__module__。
您所看到的行为之所以numpy.broadcast发生,是因为 C 类型实际上并不像 Python 中编写的类型那样具有“定义模块”。numpy.broadcast.__module__ == 'numpy'因为numpy.broadcast是用 C 编写的,并声明其名称为"numpy.broadcast",并且 C 类型__module__是根据其名称确定的。
至于如何获取类或函数的“原始定义模块”,您真正拥有的最好的__module__方法是通过__module__.