使用来自不同模块的python decorator函数

时间:2010-05-03 10:49:34

标签: python decorator

我想使用另一个模块中的函数作为装饰器,但是我需要它来操作当前模块的全局命名空间。

例如,我希望能够从中获益:

class SomeClass:
    pass

root = SomeClass

到此:

from othermodule import decorator

@decorator
class Someclass:
    pass

有什么想法吗?

4 个答案:

答案 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:
    ...