我想使用另一个模块中的函数作为装饰器,但是我需要它来操作当前模块的全局命名空间。
例如,我希望能够从中获益:
class SomeClass:
pass
root = SomeClass
到此:
from othermodule import decorator
@decorator
class Someclass:
pass
有什么想法吗?
答案 0 :(得分:5)
已经有效:
from othermodule import decorator
@decorator
class Someclass:
pass
只需输入othermodule.py
:
def decorator(cls):
#.... do something with cls
return cls
答案 1 :(得分:4)
如果任何模块,让装饰器修改全局命名空间,更不用说另一个模块,这是不好的,而且永远不必要。变异远端全局变量的代码难以阅读和维护。你绝对应该考虑修改你的设计以避免可变的全局状态,尤其是隐式赋值。
答案 2 :(得分:1)
这有点笨拙,但请在othermodule.py
:
import sys
def decorator(cls):
mod = __import__(cls.__module__)
mod.root = cls
答案 3 :(得分:0)
您可以使用一个返回装饰器并接受模块的全局变量的函数来代替直接装饰器:
def decorator(globals):
def dec(cls):
globals.root = cls
return cls
return dec
@decorator(globals())
class SomeClass:
...