私は、人々は通常、次のようにpygameのをインポートすることを参照してください。誰かがこの奇妙なPygameのインポートコンベンションを説明できますか?
import pygame
from pygame.locals import *
私はのための二行目何を理解していません。既にPygame全体をインポートした場合、なぜpygame.locals
をインポートするのですか?それがインポートされたら、既にPygameには含まれていませんか?
私は、人々は通常、次のようにpygameのをインポートすることを参照してください。誰かがこの奇妙なPygameのインポートコンベンションを説明できますか?
import pygame
from pygame.locals import *
私はのための二行目何を理解していません。既にPygame全体をインポートした場合、なぜpygame.locals
をインポートするのですか?それがインポートされたら、既にPygameには含まれていませんか?
import pygame
"pygame"名前空間にpygameモジュールをインポートします。
from pygame.locals import *
あなたの現在の名前空間へのすべての名前をpygame.localsでコピーします。これは必要ではありませんが、あなたの入力を節約します。
実際、pygameのdocsから:
このモジュールは、pygameのによって使用される様々な定数を含んでいます。そのコンテンツは自動的にpygameモジュールの名前空間に置かれます。しかし、アプリケーションはpygame.localsを使用して、Pygame定数だけを 'from pygame.locals import *'とともに含めることができます。
import pygame
を使用すると、これらの定数はすべて既に存在します。我々はこれを行う場合我々は、これを見ることができます:
>>> import pygame
>>> from pygame.locals import *
>>> set(dir(pygame.locals)).issubset(set(dir(pygame)))
True
ので、pygame.locals
はimport pygame
のサブセット..ですので、あなたはすでにpygameのをインポートした場合は絶対にない点は、それをやっていません!それ以外には、接頭辞pygame
を付けずにアクセスできます。
import pygame
from pygame.locals import *
http://www.pygame.org/docs/tut/ImportInit.html
ここで最初の行にのみ必要です。利用可能なすべてのpygameモジュールをpygameパッケージにインポートします。 2行目はオプションで、スクリプトのグローバルな名前空間に限られた定数と関数のセットを入れます。
インポートしたPygameはすでにそれを含んでいませんか?
いいえ。必ずしも。あなたは
import pygame
を実行すると
stefanos-imac:python borini$ touch a/__init__.py
stefanos-imac:python borini$ touch a/b.py
stefanos-imac:python borini$ echo "print 'hello' " >a/b.py
stefanos-imac:python borini$ python
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
>>> import a.b
hello
>>>
pygameのは完全にインポートし、作業を開始できる状態にされ、これ以上の輸入は必要ありません。
今の質問は、この行についてです:
from pygame.locals import *
これを使用しなければならない理由はいくつかあり、そうしないいくつかの理由があります。
foo.bar.baz.ClassName.classmethod()
のような名前を入力すると、名前空間に4つのルックアップがあり、時間がかかります。コードの行が多いほど、不要な時間の無駄です。from struct import *
の場合は、関数の名前をpack
とすることはできません。したがって、そのようなインポートを使用する前に、モジュールを探索する必要があります。それには何が含まれていますか?それは単独で何をインポートしますか?from foo import *
とfrom bar import *
とfrom baz import *
には、一部の変数または定数が影付きまたは上書きされることがあります。この例では、はbar.version
で上書きされ、今度はversion
と命名されています。したがって、foo.checkversion()
は正しく動作しなくなります。一般的に使用されている関数を明示的な形式でインポートするか、モジュールをよく理解していないときにクイックリファレンスにするのが適切な方法です。例えば
:
from foo.bar.baz import a_very_useful_function
または
import foo.bar.baz
quick_referenced_fn = foo.bar.baz.a_very_useful_function
ここquick_referenced_fn
はまだfoo.bar.baz.a_very_useful_function
あるとfoo.bar.baz
の名前空間で動作しますが、インタプリタは、直接そのアドレスを知っていると、追加の検索をすることはありません。
私はそれについて心配しません。 *
の輸入が悪いと言われているかもしれません。これはPygameの開発者が__all__
という属性を明確に定義していない限り、ある程度は真実です。これらの属性では、すべての便利な定数を入れています。だから、彼らはこのようにして*
輸入を安全にしました。
*
は__all__
属性に関連するので、__all__
属性に含まれる全ての定数のpygame.locals
ソースコードを検索します。
これは少し冗長なようです。 – corazza
@Bane:冗長ではありません。あなたはあなたの名前空間に何が入っているか、そしてどのようになっているかを非常に明確にしています。 –
'pygame.locals'は頻繁に呼び出す関数で満たされているため、ローカルと呼ばれます。 'pygame.locals.'を追加するたびに、コードがコンパクトになります。 –