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


Posted in Python onJune 21, 2016

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

进Shell看看:

>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, 
'__name__': '__main__', '__doc__': None, '__package__': None}

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

import __builtin__
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, 
'__name__': '__main__', '__doc__': None, '__builtin__': 
<module '__builtin__' (built-in)>, '__package__': None}

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

>>> __builtin__ is __builtins__
True
>>> type(__builtin__)
<type 'module'>
>>> type(__builtins__)
<type 'module'>

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

# 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 'module'>
type(__builtins__): <type 'dict'>
__builtins__ is __builtin__.__dict__ True
"""

结论:
__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()
# 将会全部转为大写输出

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

Python 相关文章推荐
python压缩文件夹内所有文件为zip文件的方法
Jun 20 Python
python使用pymysql实现操作mysql
Sep 13 Python
python 集合 并集、交集 Series list set 转换的实例
May 29 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
如何利用Python识别图片中的文字
May 31 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Python lambda表达式原理及用法解析
Aug 18 Python
python中Mako库实例用法
Dec 31 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 Python
Python合并多张图片成PDF
Jun 09 Python
浅谈Python中函数的参数传递
Jun 21 #Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 #Python
常见python正则用法的简单实例
Jun 21 #Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 #Python
简单讲解Python编程中namedtuple类的用法
Jun 21 #Python
Python编程中实现迭代器的一些技巧小结
Jun 21 #Python
Centos Python2 升级到Python3的简单实现
Jun 21 #Python
You might like
PHP开发框架总结收藏
2008/04/24 PHP
PHP获取MySql新增记录ID值的3种方法
2014/06/24 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
js中的string.format函数代码
2020/08/11 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
python类继承用法实例分析
2014/10/10 Python
理解Python中函数的参数
2015/04/27 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
学前教育专业毕业生自荐信
2013/10/03 职场文书
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
工业学校毕业生自荐信范文
2014/01/03 职场文书
师德学习感言
2014/01/31 职场文书
旷课检讨书3000字
2014/02/04 职场文书
祖国在我心中演讲稿400字
2014/05/04 职场文书
环保建议书500字
2014/05/14 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android
解析MySQL索引的作用
2022/03/03 MySQL