Модификация глобалов модуля с использованием внешней функции - PullRequest
1 голос
/ 07 октября 2011

У меня есть очень простая функция декоратора, которую я использую для предоставления функций, определенных в модуле, через свойство __all__ модуля.Поскольку я использую его для нескольких модулей в пакете, он определен в пакете __init__.py.

, поскольку я не могу использовать __all__ из определения, поскольку это будет означать __all__модуль __init__.py (или, скорее, пакет), в настоящее время я делаю это так:

def expose ( fn ):
    fn.__globals__['__all__'].append( fn.__name__ )

Кажется, это работает совершенно нормально.Однако я не уверен, что использование свойства __global__ является идеальным способом сделать это, тем более что это свойство кажется недокументированным (по крайней мере, я ничего не мог найти в документации).

Хорошо ли для этого используется __globals__, или, может быть, есть более простой и надежный способ сделать эту работу?

edit:

Для пояснения, мне не обязательно получать доступсвойство __all__ модуля.Я могу легко использовать другое имя и в конечном итоге с тем же вопросом.Я просто использую __all__, потому что его цель удержания всех открытых объектов в модуле соответствует моим намерениям.Но в то же время я мог бы назвать это exposedFunctions или как угодно.Поэтому вопрос больше в том, как получить доступ к глобальным свойствам модуля.

1 Ответ

2 голосов
/ 07 октября 2011

Вам может понравиться декоратор Томаса Рэйчел AllList:

class AllList(list):
    """list which can be called in order to be used as a __all__-adding decorator"""
    def __call__(self, obj):
        """for decorators"""
        self.append(obj.__name__)
        return obj 

Импортируйте его из любого места, и в верхней части вашего модуля есть

__all__ = whereever.AllList()

тогда в вашем модуле это выглядит как

@__all__
def some_func():
...

@__all__
def another_func():
...

и не нужно беспокоиться о глобалах.

Обновление

Если вы действительно хотите беспокоиться о глобалах, взгляните на Используйте класс в контексте другого модуля - это не очень красиво, однако.

...