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

Dou*_*g W 7 python decorator

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

例如,我希望能够从这个:

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)

有任何想法吗?

Mik*_*ham 6

如果任何模块,更不用说另一个模块,那么让装饰器修改全局命名空间是不好的,而且从来没有必要。使遥远的全局变量发生变异的代码难以阅读和维护。您绝对应该考虑修改您的设计以避免可变的全局状态,尤其是隐式分配。


nos*_*klo 5

那已经有效了:

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)


Dun*_*can 3

这有点 hacky,但是尝试一下othermodule.py

import sys
def decorator(cls):
    mod = __import__(cls.__module__)
    mod.root = cls
Run Code Online (Sandbox Code Playgroud)