选择 main.py :
from __future__ import print_function
from sub import print
print("hello, world")
和 sub.py :
from __future__ import print_function
def print(*args, **kwargs):
return __builtins__.print(*args, **kwargs)
使用Python 2.7.9,运行main.py
,你得到:
Traceback (most recent call last):
File "main.py", line 5, in <module>
print("hello, world")
File "/Users/ien/Studio/songifier/sub.py", line 4, in print
return __builtins__.print(*args, **kwargs)
AttributeError: 'dict' object has no attribute 'print'
为什么以及如何使这项工作?
注意:这是一个人为的例子,用于隔离在日志记录上下文中出现的问题,其中print
函数有时会进行一些奇特的日志记录,而其他时候只想调用内置的打印函数
答案 0 :(得分:3)
试试这个:
import __builtin__
from __future__ import print_function
def print(*args, **kwargs):
return __builtin__.print(*args, **kwargs)
>>> print
<function print at 0x7f80cd622668>
>>> print("Hello", "world", sep="\n")
Hello
world
python docs的摘录可以更好地解释您所看到错误的原因:
默认情况下,在
__main__
模块中,__builtins__
是。{ 内置模块__builtin__
(注意:没有'');在任何其他时间 模块,__builtins__
是字典的别名__builtin__
模块本身。
__builtins__
可以设置为用户创建的字典来创建 弱势执行形式。CPython实施细节:用户不应触及
__builtins__
;它严格来说是一个实现细节。用户 想要覆盖builtins命名空间中的值import
__builtin__
(no's')模块并修改其属性 适当。自动创建模块的命名空间 第一次导入模块。
答案 1 :(得分:-1)
引用这个问题的答案: overload print python
在Python 2.x中你不能,因为print不是一个函数,它是一个 声明。在Python 3中,print是一个函数,所以我想它可能是 被覆盖(尽管没有尝试过)。