【问题标题】:why importing a module clashes with overridden print?为什么导入模块会与覆盖的打印冲突?
【发布时间】:2014-07-29 07:51:43
【问题描述】:

我想自动为我的print 语句添加时间戳(在 Python 2.x 中)by overriding it。它可以工作,除非我导入一个也包含覆盖的模块。

我的主文件testa.py:

from __future__ import print_function
import datetime
import testb

def print(*args, **kwargs):
    __builtins__.print(datetime.datetime.now(), ' ', end='')
    return __builtins__.print(*args, **kwargs)

print("from main file")
testb.MyClass()

帮助文件testb.py

from __future__ import print_function
import datetime

def print(*args, **kwargs):
    __builtins__.print(datetime.datetime.now(), ' ', end='')
    return __builtins__.print(*args, **kwargs)

class MyClass():
    def __init__(self):
        print("from helper file")

运行 testa 时:

2014-07-29 09:43:54.375000  from main file
Traceback (most recent call last):
  File "C:/testa.py", line 10, in <module>
    testb.MyClass()
  File "C:\testb.py", line 15, in __init__
    print("from helper file")
  File "C:\testb.py", line 10, in print
    __builtins__.print(datetime.datetime.now(), ' ', end='')
AttributeError: 'dict' object has no attribute 'print'

我认为在导入testb 时,它的print 定义在某种程度上与testa 中的定义发生冲突,但这是我的想法达到极限的地方。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    不要依赖__builtins__。相反,import __builtin__ 并使用 __builtin__.print。见这里:https://docs.python.org/2/reference/executionmodel.html

    默认情况下,在__main__模块中,__builtins__是内置模块__builtin__(注意:没有's');在任何其他模块中时,__builtins____builtin__ 模块本身的字典的别名。

    CPython 实现细节:用户不应触碰__builtins__;它 严格来说是一个实现细节。想要覆盖值的用户 在 builtins 命名空间中应该导入__builtin__(没有's') 模块并适当修改其属性。

    【讨论】:

      【解决方案2】:

      可能有办法使这项工作有效,但我建议改为查看logging module

      print() 是一个很好的小帮手,可以满足您基本的“输出文本”需求。日志记录功能更强大,它可以在输出中添加时间戳和“这是在哪里打印的”信息。

      【讨论】:

      • 我知道日志记录模块并且也使用它。我的程序面临的具体情况(处于调试阶段)驱使我覆盖print
      【解决方案3】:

      您的代码看起来还不错(尽管违反了 DRY 原则)。看来您已经对名称 builtins 进行了分配(具有 dict 值),在我的 2.7 安装中,它是一个模块而不是 dict。但你没有。

      airhead:~ sholden$ python
      Python 2.7.6 (default, Nov 19 2013, 03:12:29)
      [GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
      Type "help", "copyright", "credits" or "license" for more information.
      >>> __builtins__
      <module '__builtin__' (built-in)>
      >>>
      

      @rczajka 给你正确的答案,我赞成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        • 2015-08-19
        相关资源
        最近更新 更多