Я хочу использовать функцию от другого модуля как декоратор, но мне нужен он для управления глобальным пространством имен текущего модуля.
Например, я хочу смочь пойти от этого:
class SomeClass:
pass
root = SomeClass
к этому:
from othermodule import decorator
@decorator
class Someclass:
pass
Какие-либо идеи?
Это немного халтурно, но попробуйте это в othermodule.py
:
import sys
def decorator(cls):
mod = __import__(cls.__module__)
mod.root = cls
Наличие декоратора, изменяющего глобальное пространство имен, если любой модуль, не говоря уже о другом модуле, является плохим и никогда необходимо. Код, изменяющий удаленные глобальные объекты, трудно читать и поддерживать. Вам обязательно стоит подумать об изменении своего дизайна, чтобы избежать изменяемого глобального состояния и особенно неявного присваивания.
Это уже работает:
from othermodule import decorator
@decorator
class Someclass:
pass
Просто поместите в othermodule.py
:
def decorator(cls):
#.... do something with cls
return cls