深入解析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文件夹与文件的操作实现代码
Jul 13 Python
python脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 Python
python使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
Python实现包含min函数的栈
Apr 29 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
对python中的iter()函数与next()函数详解
Oct 18 Python
python实现本地图片转存并重命名的示例代码
Oct 27 Python
PyCharm在新窗口打开项目的方法
Jan 17 Python
一行Python代码过滤标点符号等特殊字符
Aug 12 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
基于Python测试程序是否有错误
May 16 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
React组件refs的使用详解
2018/02/09 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
JS实现分页导航效果
2020/02/19 Javascript
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
Python 获取主机ip与hostname的方法
2018/12/17 Python
详解python中@的用法
2019/03/27 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
学校三八妇女节活动情况总结
2014/03/09 职场文书
保密承诺书范文
2014/03/27 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
导游词之南京中山陵
2019/11/27 职场文书
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript