You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取类或函数原始定义所在模块的完整路径?

找到类/函数最初定义的模块完整路径

太懂你说的这种痛点了——很多Python包都会把内部模块的函数、类导入到根目录的__init__.py里,对外提供更简洁的调用方式,但这时候用obj.__module__只能拿到__init__.py对应的模块名,完全找不到它们真正的定义位置。不过别慌,有几个实用的方法可以帮你精准定位:

方法1:用inspect模块做深度自省(通用方案)

Python内置的inspect模块就是专门干这种“挖根溯源”的活的,不管是函数还是类,它都能找到原始定义的文件和模块。举个例子,假设你要找your_package.broadcast的真实定义位置:

import inspect
import your_package

# 获取对象定义所在的源文件路径
source_file = inspect.getsourcefile(your_package.broadcast)
# 通过源文件拿到对应的原始模块
original_module = inspect.getmodule(your_package.broadcast)

print(f"原始定义文件路径: {source_file}")
print(f"原始模块完整名称: {original_module.__name__}")

这个方法的优势在于不受__module__属性被修改的影响——有些包为了让API看起来更整洁,会手动修改导入对象的__module__,让它显示为根模块名,但inspect是直接从对象的源码位置来判断的,绝对靠谱。

方法2:直接读取函数的__code__属性(仅函数可用)

如果你的目标是函数,那还有个更直接的方式:函数对象自带的__code__属性里,co_filename字段直接指向它被定义的源文件:

import your_package

print(f"函数原始定义文件: {your_package.broadcast.__code__.co_filename}")

这个方法简单粗暴,但只适用于函数,类没有__code__属性,所以没法用。

方法3:类的__module__(仅当未被修改时有效)

如果类的__module__属性没被手动修改过,那它本身就会指向最初定义的模块名。比如类在your_package.core.utils里定义,即使被导入到your_package.__init__,cls.__module__依然会是your_package.core.utils。但如果包开发者刻意修改了这个属性,那这个方法就失效了,还是推荐用inspect的方案更稳妥。

内容的提问来源于stack exchange,提问作者Brad Solomon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:48:58