【问题标题】:Getting a function's module of original definition获取原始定义的函数模块
【发布时间】:2018-08-14 19:59:05
【问题描述】:

给定一个类或函数,有没有办法找到它最初定义的模块的完整路径? (即使用def xxxclass 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'>

显然,broadcast 没有在__init__.py 中定义;它只是通过 these from module import * 语句之一被带入命名空间。

很高兴看到源代码np.broadcast 的定义位置(无论文件扩展名是什么,无论是.c 还是.py)。这可能吗?

【问题讨论】:

    标签: python python-import


    【解决方案1】:

    您的理解:

    但是,如果 func 被导入到包的 __init__.py 中,那么 sys.modules 将简单地重定向到 __init__.py,因为 就我而言,函数已被带入该名称空间 理解去。

    错了。 __init__.py 导入事物对 __module__ 没有影响。

    您在numpy.broadcast 中看到的行为是因为 C 类型实际上并没有像用 Python 编写的类型那样具有“定义模块”。 numpy.broadcast.__module__ == 'numpy' 因为numpy.broadcastwritten in C 并声明其名称为"numpy.broadcast",而C 类型的__module__ 由其名称确定。

    至于如何获取一个类或函数的“原始定义模块”,你真正拥有的最好是__module__和其他通过__module__的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 2015-03-18
      • 2018-02-18
      • 1970-01-01
      • 2020-09-16
      • 2011-02-02
      • 1970-01-01
      相关资源
      最近更新 更多