Автозапуск в Python

в прошлом я использовал средство автоматической загрузки perl для реализации ленивой загрузки символов в пространство имен и хотел ту же функциональность в python.

традиционно самое близкое, что вы можете получить, это использовать класс и __getattr__ класс для достижения такого рода вещи. Однако я также попытался рыться в sys.modules, и придумали этого:

# mymod.py
def greet(greeting="Hello World"):
   print greeting

class autoload(object):
    def __init__(self, __name__):
        super(autoload, self).__init__()
        self.wrapped_name = __name__
        self.wrapped = sys.modules[__name__]
    def __getattr__(self, name):
        try:
            return getattr(self.wrapped, name)
        except AttributeError:
            def f():
                greet(name+" "+self.wrapped_name)
            return f

if __name__ != "__main__":
    import sys
    sys.modules[__name__] = autoload(__name__)

это работает, как я хотел бы с точки зрения пользователя:

~> python
Python 2.5.1 (r251:54863, Jan 10 2008, 18:01:57)
[GCC 4.2.1 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymod
>>> mymod.hello()
hello
>>> from mymod import Hello_World
>>> Hello_World()
Hello_World

но меня поражает-есть ли стандартный подход, который люди обычно используют для автозапуска в python?

во-вторых, вопрос для опытных разработчиков python действительно "это кажется вам хорошей или плохой практикой"? Я достаточно опытный разработчик python, и это кажется мне действительно полезным, но мне кажется пограничным и заинтересованным в том, можно ли это рассматривать как хорошую практику, плохую практику или аналогичную.

спасибо!

3 ответов


чтобы ответить на вопрос об использовании класса для олицетворения модуля:

да, функциональность не случаен. Он был там с начала 2.серия x и по-прежнему работает в 3.x-серия.

чтобы ответить на вопрос о ленивой загрузке:

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


" ленивый импорт "может быть построен поверх" новых крючков импорта", указанных в PEP 302 и в настоящее время полностью реализована. PEP 369 использовался для покрытия "ленивого импорта", а также крючков после импорта, но с тех пор был упрощен и теперь охватывает только крючки после импорта; тем не менее, ВАС МОЖЕТ ЗАИНТЕРЕСОВАТЬ оригинальный проект.

хорошая реализация "ленивого импорта" через meta_path крюк можно найти в этот рецепт.


Нет, я не думаю, что это полезно.

зачем создавать функцию на лету атрибут, который вы пытаетесь получить из модуля? Мне это кажется странным. Похоже, что новые функции создаются магией, поэтому нужно глубоко заглянуть в реализацию, чтобы понять, что происходит. И все это без всякой синтаксической пользы.

и даже если у вас была веская причина сделать это, зачем делать это с модулем? Зачем регистрировать экземпляр класса в sys.modules? Я думаю, что создание вещей, которые кажутся тем, чем они не являются, неодобрительно в python.

Если вы специально не путаете код, я не понимаю, почему все это нужно делать.