我想使用另一个模块中的函数作为装饰器,但我需要它来操纵当前模块的全局命名空间.
例如,我希望能够从这个:
class SomeClass:
pass
root = SomeClass
Run Code Online (Sandbox Code Playgroud)
对此:
from othermodule import decorator
@decorator
class Someclass:
pass
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
如果任何模块,更不用说另一个模块,那么让装饰器修改全局命名空间是不好的,而且从来没有必要。使遥远的全局变量发生变异的代码难以阅读和维护。您绝对应该考虑修改您的设计以避免可变的全局状态,尤其是隐式分配。
那已经有效了:
from othermodule import decorator
@decorator
class Someclass:
pass
Run Code Online (Sandbox Code Playgroud)
刚加入othermodule.py
:
def decorator(cls):
#.... do something with cls
return cls
Run Code Online (Sandbox Code Playgroud)
这有点 hacky,但是尝试一下othermodule.py
:
import sys
def decorator(cls):
mod = __import__(cls.__module__)
mod.root = cls
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11142 次 |
最近记录: |