如何在Python中获取类property属性的源代码?
为什么
inspect.findsource()搞不定property,以及如何获取property的源代码 你遇到的问题其实是因为inspect.findsource()的设计目标是处理直接关联到代码对象的实体——比如类、函数、方法这些,但property本质是个描述器实例,它本身不是代码块的直接载体。你看到的pandas.DataFrame.iloc是property类的对象,它内部封装了真正干活的getter/setter方法,但这个实例本身并没有绑定到可被inspect识别的代码对象,所以直接传进去会报错。
下面给你两种可行的解决办法:
方法1:拿到property的getter方法再处理
每个property实例都有fget、fset、fdel属性,分别对应获取、设置、删除属性的底层方法。我们只需要取出fget(也就是实际处理iloc获取逻辑的函数),再用inspect工具处理这个函数就行:
import pandas import inspect # 获取iloc对应的getter方法 iloc_getter = pandas.DataFrame.iloc.fget # 获取源码内容和起始行号 source_lines, start_line = inspect.findsource(iloc_getter) # 或者直接获取源码文本 source_text = inspect.getsource(iloc_getter) # 获取源文件路径 source_file_path = inspect.getsourcefile(iloc_getter)
方法2:从类的__dict__中定位property定义
如果你想找到@property装饰器在类中定义的位置,可以直接从类的__dict__里取出对应的property对象,再通过它的fget来追踪源码:
import pandas import inspect # 从DataFrame的类字典中拿到iloc的property实例 iloc_prop = pandas.DataFrame.__dict__['iloc'] # 获取源文件路径 source_file = inspect.getsourcefile(iloc_prop.fget) # 获取源码行和起始行号 lines, start_line = inspect.getsourcelines(iloc_prop.fget)
额外注意点
- 有些pandas的核心property可能是用C扩展实现的,这时候
inspect无法获取Python源码,会抛出OSError,这种情况只能去看对应的C源码或者官方文档。 - 如果property是从父类继承来的,通过
fget也能追踪到它最初被定义的类的源码,不用担心找不到源头。
内容的提问来源于stack exchange,提问作者Ida
相关产品推荐
相关产品推荐

