为什么导入模块与重写打印冲突?

时间:2014-07-29 07:51:44

标签: python python-2.7

我想自动为我的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中的定义冲突,但这是我的思维达到极限的地方。

3 个答案:

答案 0 :(得分:4)

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

  

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

     

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

答案 1 :(得分:1)

可能有办法让这项工作成功但我建议改为查看logging module

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

答案 2 :(得分:0)

您的代码看起来并不太糟糕(尽管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给你正确答案,我已经投了赞。