Pythonでの自動読み込み
-
06-07-2019 - |
質問
過去には、名前空間へのシンボルの遅延ロードを実装するために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開発者であり、本当に便利だと思いますが、境界線として、そしてこれが良い習慣、悪い習慣、または同様のものと見なされるかどうかに興味を持っています
ありがとう!
解決
クラスを使用してモジュールを偽装するという質問に答えるには:
はい、機能は偶然ではありません。 2.xシリーズの初期から存在しており、3.xシリーズでも機能します。
遅延読み込みの質問に答えるには:
それを行うにはいくつかの方法があり、それぞれが少し神秘的になります。モジュールのなりすましを使用するのは良い方法です。
他のヒント
いいえ、それは有用ではないと思います。
モジュールから取得しようとしているすべて属性の関数をオンザフライで作成する理由私を混乱させるようです。新しい関数は魔法によって作成されているように見えるので、何が起こっているのかを理解するために実装を深く調べなければなりません。構文上の利点はありません。
そして、それを行う正当な理由があったとしても、なぜモジュールでそれを行うのですか?クラスインスタンスを sys.modules
に登録する理由物事が自分の物ではないものを見せることは、Pythonでは嫌われていると思います。
意図的にコードを難読化していない限り、なぜそんなことをするのかわかりません。