2

Python では...as <ALIAS>、次のように import ステートメントの句を使用して、インポートのエイリアスを許可します。

import mymodule as somealias
from myothermodule import spam as spamalias, ham as hamalias

現在、少なくともデフォルトのケースでは、as上記のような -clausesを持つステートメントを含む import ステートメントは__builtin__.__import__、引数リストにそのようなエイリアスの名前が含まれていないへの呼び出しになります。IOW、AFAICT、次の「エイリアシングのない」インポートステートメント__builtin__.__import__は、上記のインポートステートメントと同じ呼び出しを生成します。

import mymodule
from myothermodule import spam, ham

では、これらのエイリアス名はどのようにしてインポート プロセスに入るのでしょうか? Python には、インポート プロセスでエイリアス名がどのように使用されるかをカスタマイズする方法が用意されていますか?

(特定のアプリケーションを念頭に置いているわけではありません。Python の仕組みをよりよく理解しようとしているだけです。)

4

1 に答える 1

12

この関数__import__()は、呼び出しスコープ内の名前をバインドしません。基本的、

import foo

と類似しています

foo = __import__("foo")

import foo as bar

と類似しています

bar = __import__("foo")

名前バインディングは、関数内ではなく呼び出しスコープで発生するため、モジュールが最終的にバインドされる名前を知る必要__import__()はありません。

これは、これらのステートメントの CPython バイト コードからも確認できます。

>>> dis.dis(compile("import foo", "", "exec"))
  1           0 LOAD_CONST               0 (-1)
              3 LOAD_CONST               1 (None)
              6 IMPORT_NAME              0 (foo)
              9 STORE_NAME               0 (foo)
             12 LOAD_CONST               1 (None)
             15 RETURN_VALUE        
>>> dis.dis(compile("import foo as bar", "", "exec"))
  1           0 LOAD_CONST               0 (-1)
              3 LOAD_CONST               1 (None)
              6 IMPORT_NAME              0 (foo)
              9 STORE_NAME               1 (bar)
             12 LOAD_CONST               1 (None)
             15 RETURN_VALUE        

オペコードはIMPORT_NAME暗黙的に呼び出し__import__()、結果のモジュールを内部スタックに残します。後続STORE_NAMEのモジュールは、スタックからモジュールをポップし、それをローカル名にバインドします。2 つのスニペットの唯一の違いは、モジュールが保存される名前です。

于 2012-06-29T13:52:55.687 に答える