Использование функций декоратора Python из другого модуля - PullRequest
5 голосов
/ 03 мая 2010

Я хочу использовать функцию из другого модуля в качестве декоратора, но она мне нужна для управления глобальным пространством имен текущего модуля.

Например, я хочу иметь возможность перейти от этого:

class SomeClass:
    pass

root = SomeClass

к этому:

from othermodule import decorator

@decorator
class Someclass:
    pass

Есть идеи?

Ответы [ 4 ]

5 голосов
/ 03 мая 2010

Это уже работает:

from othermodule import decorator

@decorator
class Someclass:
    pass

Просто вставьте othermodule.py:

def decorator(cls):
    #.... do something with cls
    return cls
4 голосов
/ 03 мая 2010

Наличие декоратора изменяет глобальное пространство имен, если любой модуль, не говоря уже о другом модуле, плох и никогда не нужен. Код, который мутирует далекие глобалы, трудно читать и поддерживать. Вам определенно следует подумать об изменении своего дизайна, чтобы избежать изменяющегося глобального состояния и особенно неявного назначения.

1 голос
/ 03 мая 2010

Это немного глупо, но попробуйте это в othermodule.py:

import sys
def decorator(cls):
    mod = __import__(cls.__module__)
    mod.root = cls
0 голосов
/ 03 марта 2018

Вместо прямого декоратора у вас может быть функция, которая возвращает декоратор и принимает глобальные переменные вашего модуля:

def decorator(globals):
    def dec(cls):
        globals.root = cls
        return cls
    return dec

@decorator(globals())
class SomeClass:
    ...
...