2012-04-26 157 views

回答

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 2012-04-26 15:11:04

+2

@Bane:它不是多餘的。你正在非常清楚你的命名空間中有什麼,以及如何。 – 2012-04-26 15:14:42

+4

'pygame.locals'被稱爲locals,因爲它充滿了你頻繁調用的函數。每次添加'pygame.locals.'都會使代碼更緊湊。 – 2012-04-26 15:14:56

1
import pygame 
from pygame.locals import * 

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

這裏的第一行是隻需要一個。它將所有可用的pygame模塊導入到pygame包中。第二行是可選的,並將一組有限的常量和函數放入腳本的全局名稱空間中。

1

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

當你執行

import pygame 

Pygame的完全進口和準備工作,不需要更多的進口。

現在的問題是關於這一行:

from pygame.locals import * 

有幾個原因,這應該使用,有幾個理由不這樣做。

  1. 表現。當您鍵入類似foo.bar.baz.ClassName.classmethod()之類的內容時,名稱空間中將有4個查找,這會花費一些時間。代碼中的這些行越多,浪費的時間就越多。
  2. 簡單。當你編寫教程時,你儘可能簡單地解釋一些事情。所以代碼越少,教程就越好。
  3. 簡單。當你鍵入你的代碼時,你將它分散到不同的文件中。因爲使用較小的副文件更容易,然後將其全部導入主文件中。但是你完全理解你正在輸入的內容。
  4. Namespase污染。將模塊中的所有內容導入到全局變量中時,您在選擇全局變量時受到的限制更多。例如,from struct import *您不能將您的功能命名爲pack。所以,在使用這種導入之前,你應該探索模塊。它包含什麼?它本身導入了什麼?
  5. Mess。當您多次使用此類導入時,from foo import *from bar import *from baz import *,某些變量或常量可能會被陰影化或覆蓋。在此示例中,foo.versionbar.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__屬性,所以搜索pygame.locals源代碼包含__all__屬性中包含的所有常量。

相關問題