获取包含函数的上下文
获取包含函数的上下文
在Python中,我如何获取一个对象(在我这种情况下是一个函数)的上下文,以便我可以对其进行修改?例如,如果它是一个方法,它的上下文是类;如果它是一个自由函数,它的上下文是模块。\n相关问题:\n一个实例方法的Python装饰器能否访问类?
获取包含函数上下文的原因是想要在运行时能够修改全局和局部变量,但是使用globals()
和locals()
方法是不允许修改它们的。
虽然文档中明确说明了对字典的更改可能不会被反映出来,但实际上还是有办法进行更改。为什么这样做是可能的,如果是不被允许的呢?
这可能是由于Python的实现和解释器/编译器版本的差异造成的。尽管可以使用这种方式,但是除非你确定你的产品将使用的是哪个版本和解释器/编译器,否则依赖这种方式是愚蠢的。
Python的设计遵循严格的规则,不能违反这些规则,否则它就不再是一种可以使用的语言了。例如,不允许使用不可哈希的键作为字典的键。这个问题就表达了另一个不可能的情况。
虽然我没有很多例子可以证明这一点,但是肯定有很多严格的规则不能被违反。如果你对Python的数据模型、命名空间和执行模型有深入的理解,那么你可能敢于利用修改globals()和locals()的可能性。但是我承认我不敢自信地这样做。
我们可能需要考虑一些具体的例子来讨论。然而,我没有时间深入研究这个问题。
问题的出现原因是作者想要创建一个函数重载的装饰器,但是在装饰器中需要获得函数所在的上下文信息(类或模块)。然而,标准库中的inspect模块并不能直接提供这个功能,因此需要自行实现。
解决方法是使用inspect模块中的ismethod()和isfunction()函数来确定函数是否绑定(定义在类中)以及是否需要查找类或模块。同时,需要注意的是,方法的im_class属性并不能直接获得方法所在的类,但是可以通过使用getmro()函数来遍历类层级结构,找到方法所在的最近的类。
作者提到了如果尝试修改一个模块是否是他想要的,因为模块中的名称可能已经被其他地方引用。另外,作者也提到了如果有Ruby元编程的经验,并试图在Python中复制这种方式,可能会导致困惑和问题,因为两者的方式非常不同。
最后,作者提到了他想要解决的具体问题是创建一个函数重载的装饰器。作者在之前的评论中提到了他遇到的具体问题,但没有给出具体的解决方案。
作者想要在装饰器中获取函数所在的上下文信息,以实现函数重载的功能。解决方法是使用inspect模块来确定函数是否绑定以及获取类的层级结构。然而,在处理方法时,可能需要在元类中进行额外的操作。最后,作者提到了他想要解决的具体问题是创建一个函数重载的装饰器,但没有给出具体的解决方案。