私は人々が通常このようにPygameをインポートするのを見ます:
import pygame
from pygame.locals import *
セカンドラインが何なのかわかりません。すでにPygame全体をインポートしているのなら、なぜインポートするのpygame.locals
ですか?インポート後、Pygameにはすでに含まれていませんか?
import pygame
pygameモジュールを「pygame」名前空間にインポートします。
from pygame.locals import *
pygame.localsのすべての名前を現在の名前空間にコピーします。これは必須ではありませんが、入力する手間が省けます。
実際、pygameのドキュメントから:
このモジュールには、Pygameで使用されるさまざまな定数が含まれています。その内容は自動的にpygameモジュールの名前空間に配置されます。ただし、アプリケーションはpygame.localsを使用して、「from pygame.localsimport*」を含むPygame定数のみを含めることができます。
したがって、を使用すると、これらの定数はすべてすでに存在します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
pygameは完全にインポートされ、動作する準備ができています。これ以上のインポートは必要ありません。
今、質問はこの行についてです:
from pygame.locals import *
これを使用する必要がある理由はいくつかあり、使用しない理由もいくつかあります。
foo.bar.baz.ClassName.classmethod()
と、名前空間に4つのルックアップがあり、時間がかかります。コード内のそのような行が多いほど、時間の無駄が多くなります。from struct import *
、関数に。という名前を付けることはできませんpack
。したがって、このようなインポートを使用する前に、モジュールを調べる必要があります。何が含まれていますか?それ自体は何をインポートしますか?from foo import *
、一部の変数または定数がシェーディングまたは上書きされる場合があります。この例では、はで上書きされ、現在は。という名前になっています。そのため、正しく動作しなくなります。from bar import *
from baz import *
foo.version
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
インタプリタはそのアドレスを直接知っているため、追加のルックアップは行いません。
import pygame
from pygame.locals import *
http://www.pygame.org/docs/tut/ImportInit.html
ここの最初の行は唯一必要なものです。利用可能なすべてのpygameモジュールをpygameパッケージにインポートします。2行目はオプションであり、限られた定数と関数のセットをスクリプトのグローバル名前空間に配置します。
インポート後、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の開発者が属性を明確に定義していない限り、ある程度当てはまり__all__
ます。属性には、これらすべての便利でダンディな定数が含まれています。したがって、そのようにして、彼らはこの特定*
の輸入を安全にしました。
は属性に*
関連しているため、属性に含まれるすべての定数をソースコードで__all__
検索します。pygame.locals
__all__