Python中的自动加载

Mic*_*rks 16 python coding-style autoload

在过去,我使用了perl的AUTOLOAD工具来实现将符号延迟加载到命名空间中,并希望在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__)
Run Code Online (Sandbox Code Playgroud)

从用户的角度来看,这确实是我喜欢的方式:

~> 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
Run Code Online (Sandbox Code Playgroud)

但它让我感到震惊 - 人们倾向于使用python中的自动加载标准方法吗?

其次,对于经验丰富的python开发人员来说,问题确实是"这会对你造成好坏吗?" 我是一个经验丰富的python开发人员,它对我来说非常有用,但它让我感到边缘化并且对这是否可以被视为良好实践,不良实践或类似行为感兴趣.

谢谢!

Ale*_*lli 10

"懒惰导入"可以构建在PEP 302中指定的"导入挂钩"之上,现在已完全实现.PEP 369用于涵盖"懒惰导入"以及导入后挂钩,但此后已经简化,现在只涵盖导入后挂钩; 不过,您可能对原始草案感兴趣.

meta_path可以在此配方中找到通过钩子实现"懒惰导入"的良好实现.


Eth*_*man 2

回答使用类来模拟模块的问题:

是的,这个功能并不是偶然的。它从 2.x 系列早期就已经存在,并且在 3.x 系列中仍然有效。

回答一下延迟加载的问题:

有多种方法可以做到这一点,每种方法都有点神秘。使用模块模拟器是一个很好的方法。