1

私はPythonが初めてです。最近、 Python チュートリアルを読んでいて、"import *" に関する質問があります。チュートリアルの内容は次のとおりです。

__all__ が定義されていない場合、sound.effects import * のステートメントは、パッケージ sound.effects のすべてのサブモジュールを現在の名前空間にインポートしません。パッケージ sound.effects がインポートされていることを確認するだけで (おそらく __init__.py で初期化コードを実行している可能性があります)、パッケージで定義されている名前をインポートします。これには、__init__.py によって定義された名前 (および明示的にロードされたサブモジュール) が含まれます。

私の理解では、from sound.effects import *は「sound.effects の下のすべてをインポートする」という意味ではありませんか? 「sound.effects パッケージがインポートされていることだけを保証する」とはどういう意味ですか?私は今本当に混乱しているので、誰かがこの段落について説明してもらえますか? どうもありがとう。

4

3 に答える 3

2

「sound.effects パッケージがインポートされていることのみを確認します」とはどういう意味ですか?

モジュールのインポートとは、ファイル内の最上位インデント レベルですべてのステートメントを実行することを意味します。これらのステートメントのほとんどは、関数またはクラスを作成して名前を付ける def または class ステートメントになります。ただし、他のステートメントがある場合は、それらも実行されます。

james@Brindle:/tmp$ cat sound/effects/utils.py
mystring = "hello world"

def myfunc():
    print mystring

myfunc()
james@Brindle:/tmp$ python
Python 2.7.5 (default, Jun 14 2013, 22:12:26)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sound.effects.utils
hello world
>>> dir(sound.effects.utils)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'myfunc', 'mystring']
>>>

この例では、モジュール sound.effects.utils をインポートすると、モジュール内に「mystring」と「myfunc」という名前が定義され、ファイルの最後の行で「myfunc」の呼び出しも定義されていることがわかります。

「sound.effects パッケージをインポートする」とは、「sound/effects/init.py という名前のファイル内のモジュールをインポート (つまり、実行) する」ことを意味します

説明が言うと

そして、パッケージで定義されている名前をインポートします

それは(紛らわしいことに)「インポート」という言葉に別の意味を使用しています。この場合、パッケージで定義された名前 (つまり、init .py で定義された名前) がパッケージの名前空間にコピーされることを意味します。

sounds/effects/utils.py以前の名前を に変更するとsounds/effects/__init__.py、次のようになります。

>>> import sound.effects
hello world
>>> dir(sound.effects)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'myfunc', 'mystring']
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'sound': <module 'sound' from 'sound/__init__.pyc'>, '__doc__': None, '__package__': None}

前と同じようにmyfuncmystringが作成され、sounds.effects名前空間に含まれるようになりました。

このfrom x import y構文は、独自の名前空間ではなくローカル名前空間に物をロードするため、これらの名前に切り替えると、import sound.effects代わりfrom sound.effects import *にローカル名前空間にロードされます。

>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
>>> from sound.effects import *
hello world
>>> locals()
{'myfunc': <function myfunc at 0x109eb29b0>, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'mystring': 'hello world', '__name__': '__main__', '__doc__': None}
>>>
于 2013-07-09T03:17:45.303 に答える
0

簡単に言うと:

私の理解では、from sound.effects import *「sound.effectsの下にすべてインポートする」という意味ではありませんか?

いいえ、つまりimport sound.effects、すべてのメンバーを資格なしで使用できるようにする必要があります。

つまり、その下にあるモジュールやパッケージではなく、 のメンバーに関するものです。sound.effects

がパッケージの場合sound.effects、サブモジュールまたはサブパッケージsound.effects.foo自動的に のメンバーにはなりませんsound.effects。また、メンバーでない場合は、モジュールで使用できません。

では、その「必ずしもそうではない」資格はどうなるのでしょうか? さて、一度あなたimport sound.effects.fooが のメンバーになりsound.effectsます。したがって、あなた (または他の誰か、たとえば、soundまたはsound.effects) がimportそれを行った場合、sound.effects.foo によってモジュールにコピーされますfrom sound.effects import *

それが、この最後の文の括弧内のビットのすべてです。

これには、 によって定義された名前 (および明示的にロードされたサブモジュール) が含まれ__init__.pyます。

于 2013-07-09T03:17:53.223 に答える