我看到人們通常導入pygame的是這樣的:有人可以解釋這個奇怪的Pygame導入約定嗎?
import pygame
from pygame.locals import *
我不明白什麼是第二線。如果我們已經導入了整個Pygame,爲什麼要導入pygame.locals
? Pygame在導入後是否已經包含它?
我看到人們通常導入pygame的是這樣的:有人可以解釋這個奇怪的Pygame導入約定嗎?
import pygame
from pygame.locals import *
我不明白什麼是第二線。如果我們已經導入了整個Pygame,爲什麼要導入pygame.locals
? Pygame在導入後是否已經包含它?
import pygame
將pygame模塊導入「pygame」命名空間。
from pygame.locals import *
將pygame.locals中的所有名稱複製到當前名稱空間中。這不是必需的,但可以節省您輸入的時間。
實際上,從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.locals
是import pygame
一個子集。所以絕對沒有一點做,如果你已經導入pygame的!除此之外,您還可以在不使用pygame
前綴的情況下訪問它們。
import pygame
from pygame.locals import *
http://www.pygame.org/docs/tut/ImportInit.html
這裏的第一行是隻需要一個。它將所有可用的pygame模塊導入到pygame包中。第二行是可選的,並將一組有限的常量和函數放入腳本的全局名稱空間中。
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
>>>
當你執行
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
命名空間的作品,但解釋直接知道它的地址,不會進行其他查詢。
我不擔心它。我知道你可能被告知*
進口不好。這纔是真正的在一定程度上,除非pygame的開發商明確定義的__all__
屬性,在他們已經把所有這些方便,花花公子常量,他們有。所以,他們以這種方式使這個特定的*
導入安全。
該*
涉及__all__
屬性,所以搜索pygame.locals
源代碼包含__all__
屬性中包含的所有常量。
這似乎有點多餘。 – corazza 2012-04-26 15:11:04
@Bane:它不是多餘的。你正在非常清楚你的命名空間中有什麼,以及如何。 – 2012-04-26 15:14:42
'pygame.locals'被稱爲locals,因爲它充滿了你頻繁調用的函數。每次添加'pygame.locals.'都會使代碼更緊湊。 – 2012-04-26 15:14:56