深入解析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正则表达式抓取成语网站
Nov 20 Python
Python中的tuple元组详细介绍
Feb 02 Python
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 Python
Python的requests网络编程包使用教程
Jul 11 Python
Python学习小技巧之列表项的推导式与过滤操作
May 20 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 Python
Django框架 querySet功能解析
Sep 04 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
Oct 06 Python
python两种获取剪贴板内容的方法
Nov 06 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 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页面防重复提交方法总结
2013/11/25 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
围观tangram js库
2010/12/28 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
python paramiko实现ssh远程访问的方法
2013/12/03 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
Python socket处理client连接过程解析
2020/03/18 Python
Python如何将函数值赋给变量
2020/04/28 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
大一新生军训时的自我评价分享
2013/12/05 职场文书
理工科学生的自我评价
2013/12/15 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
岗位聘任书范文
2014/03/29 职场文书
房屋出租委托书格式
2014/09/23 职场文书
主持人开幕词
2015/01/29 职场文书
推普标语口号大全
2015/12/26 职场文书
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android