在过去,我使用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
>>> from mymod import Hello_World
>>> Hello_World()
Hello_World
但让我印象深刻的是,在python中有没有一种标准的自动加载方法?
其次,对于有经验的python开发人员来说,一个问题是“这对您来说是好的还是坏的做法”?我是一个相当有经验的python开发人员,我觉得它非常有用,但我觉得它是一个边界,我对它是否可以被视为良好实践、不良实践或类似的东西很感兴趣。
谢谢!