7

私は人々が通常このようにPygameをインポートするのを見ます:

import pygame
from pygame.locals import *

セカンドラインが何なのかわかりません。すでにPygame全体をインポートしているのなら、なぜインポートするのpygame.localsですか?インポート後、Pygameにはすでに含まれていませんか?

4

6 に答える 6

8
import pygame

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

from pygame.locals import *

pygame.localsのすべての名前を現在の名前空間にコピーします。これは必須ではありませんが、入力する手間が省けます。

于 2012-04-26T15:12:14.220 に答える
6

実際、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プレフィックスなしでそれらにアクセスできます。

于 2012-04-26T15:10:34.563 に答える
3

実行すると

import pygame

pygameは完全にインポートされ、動作する準備ができています。これ以上のインポートは必要ありません。

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

from pygame.locals import *

これを使用する必要がある理由はいくつかあり、使用しない理由もいくつかあります。

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

于 2012-04-26T23:30:07.867 に答える
2
import pygame
from pygame.locals import *

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

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

于 2012-04-26T15:11:31.570 に答える
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
>>> 
于 2012-04-26T15:12:38.477 に答える
0

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

は属性に*関連しているため、属性に含まれるすべての定数をソースコードで__all__検索します。pygame.locals__all__

于 2017-10-13T19:57:09.430 に答える