2016-03-30 8 views
2

にモジュールからインポートすることはできません私はimport module as mdは、なぜ私はメモリ

を行うことができ、私は以下のいずれかを行うことができない理由私はそうimport module.submodule as smd

を行うことができますか?

import module as md 
import md.submodule as smd 

または

import module as md 
from md import submodule as smd 

異なり質問:なぜ私はむしろ、私はそれを与えた名前よりも、長い名前を使用する必要があるのですか?

最初の行の後で、mdはメモリ内のファーストクラスのオブジェクトに過ぎません。なぜ私はこのオブジェクトからインポートできないようにしましたか? mdは、既存のモジュールであってもよいので

+0

実際には、長い名前の '.'は現在のオペレーティングシステムのパス名構成要素の区切り文字(' os.sep')を表しているため、複合名はモジュールやサブモジュールへのパスを指定するプラットフォームに依存しない方法です実際にはファイルシステムに存在しなければなりません。 – martineau

答えて

1

モジュールdisとそのdocumentationが何を言うのかを見てみると、バックグラウンドで何が起こるかを明確にすることができます。

>>> def g(): 
... import numpy as np 
... 
>>> def h(): 
... import np.ma as ma # note: np is not defined! 
... 
>>> dis.dis(g) 
    2  0 LOAD_CONST    1 (-1) 
      3 LOAD_CONST    0 (None) 
      6 IMPORT_NAME    0 (numpy) 
      9 STORE_FAST    0 (np) 
     12 LOAD_CONST    0 (None) 
     15 RETURN_VALUE   
>>> dis.dis(h) 
    2  0 LOAD_CONST    1 (-1) 
      3 LOAD_CONST    0 (None) 
      6 IMPORT_NAME    0 (np.ma) 
      9 STORE_FAST    0 (np) 
     12 LOAD_CONST    0 (None) 
     15 RETURN_VALUE   

IMPORT_NAME手段は、ドキュメントを引用する:

は[namei]モジュールco_namesをインポート。 TOSとTOS1がポップされ、fromlistとlevel引数が__import__()になります。モジュールオブジェクトがスタックにプッシュされます。現在の名前空間は影響を受けません。正しいimport文の場合、後続のSTORE_FAST命令が名前空間を変更します。

(TOSおよびTOS1は、スタックの先頭であり、2番目の最上位のスタックアイテムです。)

したがって、私はそれが動作しない理由は、importステートメントは、あなたが渡すトークンが本当にモジュール名(オブジェクトではない)である場合にのみ機能するということです__import__関数はモジュール名を必要とし、参照/変数/その他のものは必要としません。

この機能の詳細については、__import__のドキュメントページを参照してください。

3

を、とのpython以来 - (md = import("module")のようなものとは対照的に、Pythonの連中が明示的にこの構文のために選んだ。特にコードmoduleは、開始時にメモリ内にすでに利用可能であるかのように「読み」を考慮して)

>> import urllib2 as json 

これは、あなたがしたい場合はどのような、JSONは本当のモジュールであり、インポートすることができていても、動作します:たとえば、それはあなたがその名前を交換できるようになる、許容ですが、あなたはいつでもあなたはまだそれをインポートすることができます後でそれをインポートしますか?

ますので、この場合には

>> json 
>> <module 'urllib2' from '/usr/lib/python2.7/urllib2.pyc'> 

をJSONをチェックするとき、それはurllib2のを指摘されていますが、まだ本当のJSONのサブモジュールをインポートすることができます。

>> from json import tool as tl 

JSONは、以前と同じままになりますこれはurllib2です。 しかし、あなたは

>> import json 
>> <module 'json' from '/usr/lib/python2.7/json/__init__.pyc'> 

だからあなたの質問に答えるために、それはおそらく(それが本当のモジュールの名前である場合)、それはまだアクセスあなたのはずの別名からモジュールを取得できるようにする方法ですそれを取り戻すことができます。

関連する問題