【问题标题】:Why can't Python find the built-in print function when calling from an imported function?为什么 Python 从导入的函数调用时找不到内置的打印函数?
【发布时间】:2016-07-20 22:30:07
【问题描述】:

获取这个ma​​in.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 函数有时会执行一些花哨的日志记录,而其他时候只想调用内置的打印函数。

【问题讨论】:

    标签: python


    【解决方案1】:

    试试这个:

    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__(注意:没有's');当在任何其他 模块,__builtins__ 是字典的别名 __builtin__ 模块本身。

    __builtins__ 可以设置为用户创建的字典来创建一个 受限执行的弱形式。

    CPython 实现细节: 用户不应触碰__builtins__;这严格来说是一个实现细节。用户 想要覆盖内置命名空间中的值应该import __builtin__(没有's')模块并修改其属性 适当地。模块的命名空间是自动创建的 第一次导入模块。

    【讨论】:

      【解决方案2】:

      引用这个问题的答案: overload print python

      在 Python 2.x 中你不能,因为 print 不是一个函数,它是一个 陈述。在 Python 3 中 print 是一个函数,所以我想它可能是 被覆盖(虽然没有尝试过)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-23
        • 1970-01-01
        • 2016-01-17
        • 1970-01-01
        • 2022-12-11
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多