私は人々が通常このように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.versionbar.versionversionfoo.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__