从不同模块使用Python装饰器函数
我想用另一个模块里的一个函数作为装饰器,但我需要这个函数能够操作当前模块的全局命名空间。
举个例子,我想把这个:
class SomeClass:
pass
root = SomeClass
变成这个:
from othermodule import decorator
@decorator
class Someclass:
pass
有没有什么好主意?
4 个回答
6
让一个装饰器去修改全局命名空间,如果是任何模块,更别提其他模块,这样做是很糟糕的,而且根本没有必要。因为改变远处的全局变量会让代码变得难以阅读和维护。你应该认真考虑调整你的设计,避免可变的全局状态,尤其是隐式赋值。
11
这个已经可以用了:
from othermodule import decorator
@decorator
class Someclass:
pass
只需要放入 othermodule.py
文件:
def decorator(cls):
#.... do something with cls
return cls
3
这有点小技巧,但你可以试试在 othermodule.py
里这样做:
import sys
def decorator(cls):
mod = __import__(cls.__module__)
mod.root = cls