从不同模块使用Python装饰器函数

16 投票
4 回答
23642 浏览
提问于 2025-04-15 22:17

我想用另一个模块里的一个函数作为装饰器,但我需要这个函数能够操作当前模块的全局命名空间。

举个例子,我想把这个:

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

撰写回答