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开发人员,它对我来说非常有用,但它让我感到边缘化并且对这是否可以被视为良好实践,不良实践或类似行为感兴趣.
谢谢!
回答使用类来模拟模块的问题:
是的,这个功能并不是偶然的。它从 2.x 系列早期就已经存在,并且在 3.x 系列中仍然有效。
回答一下延迟加载的问题:
有多种方法可以做到这一点,每种方法都有点神秘。使用模块模拟器是一个很好的方法。