获取包含函数的上下文

时间:2011-12-28 11:09:34

标签: python metaprogramming inspect

在Python中,如何获取对象的包含上下文(在我的情况下是一个函数),所以我可以修改它?例如,如果它是一个方法,它的上下文就是类;如果它是一个自由函数,它的上下文就是模块。

  

相关问题:
  Can a Python decorator of an instance method access the class?

2 个答案:

答案 0 :(得分:1)

我认为您需要推出自己的版本,但标准库inspect module将为您提供所需的大部分内容。

inspect.ismethod()inspect.isfunction()将帮助确定函数是否绑定(在类中定义),从而确定您是在寻找类还是模块(您希望...因为函数可能在另一个范围而不是模块中定义...例如,作为另一个函数或方法范围内的本地定义的函数,或者作为一个lambda(真的是同样的事情))

特别注意方法的im_class不会检索定义方法的类。但是你可以(使用inspect.getmro())遵循类层次结构并找到'最新的'定义方法的类。

BTW - 我想知道修改模块是否符合你的要求......在很多情况下,该模块中的名称可能已经被导入其他地方......)特别是我会担心(对你和你而言)未来的理智)如果你有ruby元编程经验,并试图在python中复制它 - 它是非常不同的,最好不要尝试在python中做rubyish事。

答案 1 :(得分:0)

您的意思是功能globals()locals()。它们都返回一个包含全局和本地的字典。但是,您不能对它们进行任何元编程,因为不允许更改它们。

AFAIK除了当前(globals / locals的来电者)之外,无法获取任何内容。