我想创建一个python上下文管理器,它允许以下操作(如果函数是string,那么reverse_decorator应用带第一个参数的decorated函数):
print('hi')
with MyFunctionDecorator('print', reverse_decorator):
print('hello')
print('bye')
导致:
^{pr2}$关键不是print函数本身,而是编写这种上下文管理器,它可以修饰任何函数—本地、全局、内置,来自任何模块。这在python中是可能的吗?我该怎么做?在
编辑:为了澄清一点,重点是不必在上下文中更改代码。在
这是我的方法:
输出:
^{pr2}$这应该适用于函数和其他模块等等,因为它修改了模块或类的属性。类方法很复杂,因为一旦你创建了一个类的实例,它的属性指向对象创建时在类中定义的函数,所以你必须在修改特定实例的行为还是修改托管上下文中新实例的行为之间做出选择,如示例所示。另外,试图修饰诸如
list
或dict
之类的内置类的方法是行不通的。在如果您对其进行修改并添加一点:
下面是一个适用于此示例的定义*:
^{pr2}$但很可能只需显式地执行,在Python Zen之后:
*此代码在许多情况下都不起作用,如the comments中所述:
import x from y as z
导入的globals()
中定义了一个print
函数,而不是直接作为一个内置函数因为这更多的是一个概念的证明,是的,我们可以在这个例子中编写一个decorator,我不会试图修复这些缺点。使用我上面给出的方法,或者只使用装饰:
相关问题 更多 >
编程相关推荐