解釋者在這些情況下做了什麼?當執行「from xyz import Abc」時,解釋器做了什麼?
from xyz import Abc
from xyz import *
是否有反正解析完整的文件xyz.py?另一種方法應該更快嗎?還是僅僅是一個可讀性問題,人們更喜歡第二種方法?
解釋者在這些情況下做了什麼?當執行「from xyz import Abc」時,解釋器做了什麼?
from xyz import Abc
from xyz import *
是否有反正解析完整的文件xyz.py?另一種方法應該更快嗎?還是僅僅是一個可讀性問題,人們更喜歡第二種方法?
它不應該在性能方面有所差異,因爲整個模塊都必須以任何方式處理。
區別在於可讀性和名稱空間的污染。爲了最大限度地減少名稱衝突的機會以及名稱隱藏導致的意外行爲,謹慎的做法是僅導入實際使用的對象。
所有頂級名導入到一個模塊,也可以除非
__all__
參數已設置再次從該模塊 進口。因此,你通常最終會以更項目是 添加到您當地的命名空間比你討價還價每個命令後在命名空間
區別:
>>> from math import *
>>> len(vars())
46
>>> vars()
{'pow': <built-in function pow>, 'fsum': <built-in function fsum>, 'cosh': <built-in function cosh>, 'ldexp': <built-in function ldexp>, 'hypot': <built-in function hypot>, 'acosh': <built-in function acosh>, 'tan': <built-in function tan>, 'asin': <built-in function asin>, 'isnan': <built-in function isnan>, 'log': <built-in function log>, 'fabs': <built-in function fabs>, 'floor': <built-in function floor>, 'atanh': <built-in function atanh>, 'sqrt': <built-in function sqrt>, '__package__': None, 'frexp': <built-in function frexp>, 'factorial': <built-in function factorial>, 'degrees': <built-in function degrees>, 'pi': 3.141592653589793, 'log10': <built-in function log10>, '__doc__': None, 'asinh': <built-in function asinh>, 'fmod': <built-in function fmod>, 'atan': <built-in function atan>, '__builtins__': <module '__builtin__' (built-in)>, 'copysign': <built-in function copysign>, 'cos': <built-in function cos>, 'ceil': <built-in function ceil>, 'atan2': <built-in function atan2>, 'isinf': <built-in function isinf>, 'sinh': <built-in function sinh>, '__name__': '__main__', 'trunc': <built-in function trunc>, 'expm1': <built-in function expm1>, 'e': 2.718281828459045, 'tanh': <built-in function tanh>, 'radians': <built-in function radians>, 'sin': <built-in function sin>, 'lgamma': <built-in function lgamma>, 'erf': <built-in function erf>, 'erfc': <built-in function erfc>, 'modf': <built-in function modf>, 'exp': <built-in function exp>, 'acos': <built-in function acos>, 'log1p': <built-in function log1p>, 'gamma': <built-in function gamma>}
>>> ================================ RESTART ================================
>>> from math import log10
>>> len(vars())
5
>>> vars()
{'__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', 'log10': <built-in function log10>, '__doc__': None}
沒有更詳細的解釋,我不能給你打勾,但這對於未來的讀者來說相當重要! +1 – erikbwork 2012-08-13 12:23:13
似乎沒有是的「的定義命名空間污染「隨處可見。你能更清楚地說出它的含義嗎?有趣的是,維基百科的[只有這個術語的概念](http://en.wikipedia.org/wiki/Namespace_%28computer_science%29#Python)是在Python的''xyz import *'的背景下'' – erikbwork 2012-08-13 12:22:06
@ erikb85 :除非設置了__all__參數,否則也可以從該模塊再次導入所有導入模塊的頂級名稱。因此,通常最終將添加更多項目添加到您的本地命名空間,而不是您討價還價的項目。 – 2012-08-13 12:24:46
命名空間用於防止相同名稱的類/函數/變量相互衝突。通過導入模塊中的所有內容,可以增加某個項目的機會,這些項目不想用於實際想要使用的項目。使用合格進口可以最大限度地降低風險 – 2012-08-13 12:27:15