如果你已經(jīng)學(xué)習(xí)了包,模塊這些知識了逢防。
你會不會有好奇:Python為什么可以直接使用一些內(nèi)建函數(shù),不用顯式的導(dǎo)入它們蒲讯,比如 str() int() dir()
...忘朝?
原因是Python解釋器第一次啟動的時候 __builtins__
就已經(jīng)在命名空間了(Note: 有s)
進(jìn)Shell看看:
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>,
'__name__': '__main__', '__doc__': None, '__package__': None}
<br />
你可以再次導(dǎo)入 __builtin__
(Note: 沒有s):
import __builtin__
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>,
'__name__': '__main__', '__doc__': None, '__builtin__':
<module '__builtin__' (built-in)>, '__package__': None}
<br />
這時候多了一個 __builtin__
對象,你可以判斷它們是不是相同的:
>>> __builtin__ is __builtins__
True
>>> type(__builtin__)
<type 'module'>
>>> type(__builtins__)
<type 'module'>
<br />
現(xiàn)在我們把它從一個文件導(dǎo)入:
# file1.py
import __builtin__
print "module name __name__ : ", __name__
print "__builtin__ is __builtins__: ", __builtin__ is __builtins__
print "type(__builtin__): ", type(__builtin__)
print "type(__builtins__): ", type(__builtins__)
print "__builtins__ is __builtin__.__dict__", __builtins__ is __builtin__.__dict__
# file2.py
import file1
"""結(jié)果:
module name __name__ : file
__builtin__ is __builtins__: False
type(__builtin__): <type 'module'>
type(__builtins__): <type 'dict'>
__builtins__ is __builtin__.__dict__ True
"""
<br / >
結(jié)論:
__builtins__
是對內(nèi)建模塊 __builtin__
的引用判帮,并且有如下兩個方面差異:
在主模塊中局嘁,即沒有被其他文件導(dǎo)入。
__builtins__
是對__builtin__
本身的引用晦墙,兩者是相同的悦昵。
通過
__builtins__ is __builtin__.__dict__
猜想:
在非'__main__'
模塊中,也就是模塊被導(dǎo)入后偎痛,__builtins__
應(yīng)該屬于__builtin__.__dict__
的一部分旱捧,是對__builtin__.__dict__
的引用,而非builtin本身踩麦,它在任何地方都可見枚赡,此時builtins的類型是字典。
<br / >
裝飾內(nèi)建函數(shù)
Python 官方文檔 解釋了如何裝飾一個內(nèi)建函數(shù):
import __builtin__
def open(path):
f = __builtin__.open(path, 'r')
return UpperCaser(f)
class UpperCaser:
__metaclass__ = type
def __init__(self, f):
self._f = f
def read(self):
return self._f.read().upper()
print open('./a.txt').read()
# 將會全部轉(zhuǎn)為大寫輸出
<br />
Note:Python3.X版本中谓谦,內(nèi)建模塊更名為builtins贫橙,與Python2.X有所不同
<br />
參考:
Python所有內(nèi)建函數(shù)
__builtin__ 與 __builtins__ 的區(qū)別與關(guān)系
What's the deal with __builtins__ vs __builtin__