15

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

4

3 に答える 3

10

「遅延インポート」はPEP 302で指定された「インポート フック」の上に構築でき、現在は完全に実装されています。PEP 369 は、以前は「遅延インポート」とインポート後のフックをカバーしていましたが、その後単純化され、インポート後のフックのみをカバーするようになりました。それでも、元のドラフトに興味があるかもしれません。

meta_pathフックを介した「遅延インポート」の適切な実装は、このレシピにあります。

于 2009-06-21T18:24:23.827 に答える
-1

いいえ、役に立たないと思います。

モジュールから取得しようとしているすべての属性に対して、その場で関数を作成するのはなぜですか? 私には混乱しているようです。新しい関数は魔法によって作成されているように見えるので、何が起こっているのかを理解するには実装を深く調べる必要があります。そして、構文上の利点はありません。

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

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

于 2009-06-22T11:18:48.183 に答える