过去,我使用 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__)
从用户的角度来看,这确实以我想要的方式工作:
~> 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 mymod
>>> from mymod import Hello_World
>>> Hello_World()
Hello_World mymod
但这让我印象深刻——人们是否倾向于使用标准方法在 python 中自动加载?
其次,对于有经验的 python 开发人员来说,一个问题真的是“这对你来说是好还是坏的做法”?我是一位经验丰富的 Python 开发人员,它让我觉得它真的很有用,但它让我觉得它是边缘性的,并且对这是否可以被视为好的做法、坏做法或类似做法感兴趣。