過去に、名前空間へのシンボルの遅延読み込みを実装するために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開発者であり、非常に便利だと思いますが、境界線として私を驚かせ、これを良い習慣、悪い習慣、または同様のものと見なすことができるかどうかに興味があります。