在 Python 中,如何获取对象(在我的情况下为函数)的包含上下文,以便修改它?例如,如果它是一个方法,它的上下文就是类;如果它是一个自由函数,它的上下文就是模块。
相关问题:
实例方法的 Python 装饰器可以访问该类吗?
在 Python 中,如何获取对象(在我的情况下为函数)的包含上下文,以便修改它?例如,如果它是一个方法,它的上下文就是类;如果它是一个自由函数,它的上下文就是模块。
相关问题:
实例方法的 Python 装饰器可以访问该类吗?
我认为您将需要推出自己的版本,但标准库inspect
模块将为您提供您需要的大部分内容。
inspect.ismethod()
并将inspect.isfunction()
帮助确定函数是否已绑定(在类中定义),从而确定您是在寻找类还是模块(您希望......因为函数可能在模块之外的另一个范围内定义。 .. 例如作为另一个函数或方法范围内的本地定义函数,或作为 lambda(实际上是一样的))
特别注意,im_class
方法的 不会检索您定义该方法的类。但是您可以(使用inspect.getmro()
)遵循类层次结构并找到定义该方法的“最新”类。
顺便说一句 - 我想知道修改模块是否会是你想要的......在许多情况下,该模块中的名称可能已经在其他地方导入......)特别是我会担心(为了你和你未来的理智)如果你有 ruby 元编程经验并试图在 python 中复制它 - 这是非常不同的,最好不要尝试在 python 中做 rubyish 的事情。
你的意思是函数globals()
和locals()
。它们都返回一个分别包含全局变量和局部变量的字典。但是,您不能对它们进行任何元编程,因为不允许更改它们。
globals
AFAIK 除了当前( /的调用者)之外,没有办法获取任何内容的上下文locals
。