为什么Python在从导入的函数调用时找不到内置的print函数?

时间:2016-07-20 22:30:07

标签: python

选择 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函数有时会进行一些奇特的日志记录,而其他时候只想调用内置的打印函数

2 个答案:

答案 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是一个函数,所以我想它可能是   被覆盖(尽管没有尝试过)。