我想自动为我的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
中的定义冲突,但这是我的思维达到极限的地方。
答案 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给你正确答案,我已经投了赞。