深入解析Python中的__builtins__内建对象

WBOY
Release: 2016-07-06 13:30:00
Original
1736 people have browsed it

如果你已经学习了包,模块这些知识了。
你会不会有好奇:Python为什么可以直接使用一些内建函数,不用显式的导入它们,比如 str() int() dir() ...?
原因是Python解释器第一次启动的时候 __builtins__ 就已经在命名空间了(Note: 有s)

进Shell看看:

>>> globals() {'__builtins__': , '__name__': '__main__', '__doc__': None, '__package__': None}
Copy after login


你可以再次导入 __builtin__(Note: 没有s):

import __builtin__ >>> globals() {'__builtins__': , '__name__': '__main__', '__doc__': None, '__builtin__': , '__package__': None}
Copy after login


这时候多了一个 __builtin__ 对象,你可以判断它们是不是相同的:

>>> __builtin__ is __builtins__ True >>> type(__builtin__)  >>> type(__builtins__) 
Copy after login


现在我们把它从一个文件导入:

# 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 """结果: module name __name__ : file __builtin__ is __builtins__: False type(__builtin__):  type(__builtins__):  __builtins__ is __builtin__.__dict__ True """
Copy after login


结论:
__builtins__ 是对内建模块 __builtin__ 的引用,并且有如下两个方面差异:

在主模块中,即没有被其他文件导入。__builtins__是对 __builtin__ 本身的引用,两者是相同的。

通过 __builtins__ is __builtin__.__dict__ 猜想:
在非 '__main__' 模块中,也就是模块被导入后,__builtins__ 应该属于 __builtin__.__dict__ 的一部分,是对 __builtin__.__dict__ 的引用,而非builtin本身,它在任何地方都可见,此时builtins的类型是字典。

装饰内建函数
Python 官方文档 解释了如何装饰一个内建函数:

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() # 将会全部转为大写输出
Copy after login

Note:Python3.X版本中,内建模块更名为builtins,与Python2.X有所不同

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!