2012-04-26 6 views
5

私は、人々は通常、次のようにpygameのをインポートすることを参照してください。誰かがこの奇妙なPygameのインポートコンベンションを説明できますか?

import pygame 
from pygame.locals import * 

私はのための二行目何を理解していません。既にPygame全体をインポートした場合、なぜpygame.localsをインポートするのですか?それがインポートされたら、既にPygameには含まれていませんか?

答えて

6
import pygame 

"pygame"名前空間にpygameモジュールをインポートします。

from pygame.locals import * 

あなたの現在の名前空間へのすべての名前をpygame.localsでコピーします。これは必要ではありませんが、あなたの入力を節約します。

5

実際、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.localsimport pygameのサブセット..ですので、あなたはすでにpygameのをインポートした場合は絶対にない点は、それをやっていません!それ以外には、接頭辞pygameを付けずにアクセスできます。

+0

これは少し冗長なようです。 – corazza

+2

@Bane:冗長ではありません。あなたはあなたの名前空間に何が入っているか、そしてどのようになっているかを非常に明確にしています。 –

+4

'pygame.locals'は頻繁に呼び出す関数で満たされているため、ローカルと呼ばれます。 'pygame.locals.'を追加するたびに、コードがコンパクトになります。 –

1
import pygame 
from pygame.locals import * 

http://www.pygame.org/docs/tut/ImportInit.html

ここで最初の行にのみ必要です。利用可能なすべてのpygameモジュールをpygameパッケージにインポートします。 2行目はオプションで、スクリプトのグローバルな名前空間に限られた定数と関数のセットを入れます。

1

インポートした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 
>>> 
2

pygameのは完全にインポートし、作業を開始できる状態にされ、これ以上の輸入は必要ありません。

今の質問は、この行についてです:

from pygame.locals import * 

これを使用しなければならない理由はいくつかあり、そうしないいくつかの理由があります。

  1. パフォーマンス。foo.bar.baz.ClassName.classmethod()のような名前を入力すると、名前空間に4つのルックアップがあり、時間がかかります。コードの行が多いほど、不要な時間の無駄です。
  2. 簡潔です。チュートリアルを書くときには、可能な限り単純なことを説明しようとします。コードが少ないほど、チュートリアルが優れています。
  3. コードを入力すると、別のファイルに展開されます。これは、より小さなサイドファイルで作業してから、メインファイルにすべてをインポートする方が簡単だからです。しかし、あなたはあなたが何をインポートしているかを完全に理解しています。
  4. 名前空間汚染。モジュールからグローバルにすべてをインポートすると、グローバル変数の選択が制限されます。たとえば、from struct import *の場合は、関数の名前をpackとすることはできません。したがって、そのようなインポートを使用する前に、モジュールを探索する必要があります。それには何が含まれていますか?それは単独で何をインポートしますか?
  5. このようなインポートを何度も使用すると、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の名前空間で動作しますが、インタプリタは、直接そのアドレスを知っていると、追加の検索をすることはありません。

0

私はそれについて心配しません。 *の輸入が悪いと言われているかもしれません。これはPygameの開発者が__all__という属性を明確に定義していない限り、ある程度は真実です。これらの属性では、すべての便利な定数を入れています。だから、彼らはこのようにして*輸入を安全にしました。

*__all__属性に関連するので、__all__属性に含まれる全ての定数のpygame.localsソースコードを検索します。

関連する問題