如何使print()覆盖“全局”工作

时间:2013-07-11 18:38:41

标签: python overloading

How to override python builtins with an import statement我获得了以下代码:

from __future__ import print_function
def print(*args, **kwargs):
    .
    . some intervening logic
    .
    return __builtins__.print(*args, **kwargs)

此代码工作正常,但具有模块范围。也就是说,如果此文件中有print语句,则它们按预期工作,通过定义的print()函数。但是,导入它(来自foo import *)在导入它的模块中没有任何效果。

如果我想要“全局”覆盖打印功能,那么最好如何做到这一点。理想的情况是:

from MyOverrides import *
.
.
.
class foo():
    .
    .
    def bar( self ):
        print( "this is my overridden print statement" )

我在这里错过了什么未来,覆盖和打印()?

我的环境是2.6并且前进,但不是3.0。

2 个答案:

答案 0 :(得分:1)

您不能(也不应该)拥有打开未来声明的全局覆盖。由于未来的语句会影响Python源文件的解析和编译方式,因此在Python甚至可以告诉MyOverrides定义打印函数之前,模块使用的所有未来语句都必须是显式的。您无法从其他模块导入future语句。

替换打印功能的最安全方法是在所有模块中明确使用from __future__ import print_function,然后从其中一个模块导入print的替换。请勿替换__builtin__.print

如果要在stdout中输出所有输出,无论是通过print语句还是print函数,都可以用包装器替换sys.stdout

import sys

stdout = sys.stdout

class new_stdout(object):
    def write(*args, **kwargs):
        # do whatever
        stdout.write(*args, **kwargs)

sys.stdout = new_stdout()

但是,这可能是一个坏主意,它不会影响使用显式文件参数的print语句或打印函数。

答案 1 :(得分:1)

另一个stackoverflow用户提供了大部分答案,但后来显然删除了它(?)。这是一个有效的解决方案。我再一次认识到这不一定是最佳实践,但在某些情况下它可以很方便。

模块MyOverrides.py:

from __future__ import print_function
import __builtin__

builtin_print = __builtin__.print
def print(*args, **kwargs):
    .
    .... whatever code you need here
    .
    return builtin_print(*args, **kwargs)
__builtin__.print = print

模块test.py:

from __future__ import print_function
from MyOverrides import *
.
.
.

正如另一位用户所指出的,未来导入需要在每个打算使用未来功能的模块中进行。

感谢用户@kindall回答,然后显然撤回了答案。