【问题标题】:Why import builtins if you never redefine any built-in functions?如果您从不重新定义任何内置函数,为什么还要导入内置函数?
【发布时间】:2015-03-27 17:19:21
【问题描述】:

我正在查看此 repo https://github.com/datacenter/cobra 中的代码,并且我在几个文件中看到了来自内置函数的导入,如下所示:

cobra/internal/codec/jsoncodec.py:15:from builtins import str
cobra/internal/codec/xmlcodec.py:15:from builtins import str
cobra/internal/base/moimpl.py:16:from builtins import next
cobra/internal/base/moimpl.py:17:from builtins import str
cobra/internal/base/moimpl.py:18:from builtins import object
cobra/internal/rest/accessimpl.py:15:from builtins import object
cobra/internal/rest/accessimpl.py:16:from builtins import str
cobra/mit/session.py:15:from builtins import str
cobra/mit/session.py:16:from builtins import object
cobra/mit/meta.py:16:from builtins import str
cobra/mit/meta.py:17:from builtins import next
cobra/mit/meta.py:18:from builtins import object
cobra/mit/access.py:21:from builtins import object
cobra/mit/naming.py:15:from builtins import next
cobra/mit/naming.py:16:from builtins import str
cobra/mit/naming.py:17:from builtins import object
cobra/mit/request.py:15:from builtins import str
cobra/mit/request.py:16:from builtins import object

这样做的逻辑/获得了什么?模块中没有重新定义这些对象的地方。

顺便说一句,这破坏了我对文档中指定的该模块的 2.7 兼容性。

【问题讨论】:

  • 也许更好的主意是问问项目的开发人员他们为什么要这样做!
  • 在模块命名空间中包含这些名称将 1. 比以内置方式访问它们的性能略高一些,并且 2. 不受任何以后导入的模块对内置的重新定义的影响.他们为什么这样做,我不能说;人们只是更喜欢这种方式......
  • 哪种情况下需要性能导入内置方法?而且,这种方法不适用于 Python 2.x
  • @MauroBaraldi - 在 2.x 上,builtins 来自 pip install futures。没有原生的builtins 模块。
  • @tdelaney 感谢您澄清这一点

标签: python python-2.7 python-3.x python-import


【解决方案1】:

我不知道为什么它专门在 cobra 中完成,但它是编写适用于 python 2 和 3 的代码的一个技巧。请参阅compatible_idioms。它不应该破坏 2.7,但您必须编写“3x-ish”代码。

更新

对于 2.x,builtins 模块需要从 pypi 安装。它不是原生内置函数,而是 3.x 兼容更新。

【讨论】:

  • 注意builtinsfuture pypi 包的一部分(即可以通过pip install future 安装)
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 2011-01-20
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2011-04-03
相关资源
最近更新 更多