質問

過去には、名前空間へのシンボルの遅延ロードを実装するために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シリーズでも機能します。

遅延読み込みの質問に答えるには:

それを行うにはいくつかの方法があり、それぞれが少し神秘的になります。モジュールのなりすましを使用するのは良い方法です。

他のヒント

"遅延インポート" 「インポートフック」の上に構築できます。 PEP 302 で指定され、現在完全に実装されています。 「怠lazな輸入」をカバーするために使用されるPEP 369;インポート後のフックと同様に、それ以降は簡素化され、インポート後のフックのみをカバーするようになりました。それでも、元のドラフトに興味があるかもしれません。

>

「遅延インポート」の適切な実装 meta_path フックを介してこのレシピで見つけることができます。

いいえ、それは有用ではないと思います。

モジュールから取得しようとしているすべて属性の関数をオンザフライで作成する理由私を混乱させるようです。新しい関数は魔法によって作成されているように見えるので、何が起こっているのかを理解するために実装を深く調べなければなりません。構文上の利点はありません。

そして、それを行う正当な理由があったとしても、なぜモジュールでそれを行うのですか?クラスインスタンスを sys.modules に登録する理由物事が自分の物ではないものを見せることは、Pythonでは嫌われていると思います。

意図的にコードを難読化していない限り、なぜそんなことをするのかわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top