如何进行打印()重写工作“全局”(How to make print() override work

2019-10-18 08:42发布

从如何覆盖蟒蛇建宏用import语句我得到下面的代码:

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

此代码工作正常,但模块范围。 也就是说,如果有这个文件,他们具有预期之内打印报表,经历了print()函数的定义。 然而,在导入(从富进口*)具有其导入模块内没有影响。

如果我要重写打印功能“全局”这是怎么做最好。 理想的情况是:

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

我缺少的未来 ,替代和打印()吗?

我的环境是2.6和前瞻性,而不是3.0。

Answer 1:

你不能(也不应该)有一个全局覆盖,关于未来的陈述圈。 由于未来的语句影响一个Python源文件解析和编译,之前的Python甚至可以告诉的方式MyOverrides定义打印功能,未来所有的报表模块的用途必须是明确的。 你不能从另一个模块导入未来的语句。

更换打印功能最安全的方法是明确使用from __future__ import print_function在所有的模块,然后导入进行更换print从你的模块中。 不要更换__builtin__.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()

然而,这可能是一个坏主意,也不会影响使用明确的文件参数报表打印或打印功能。



Answer 2:

另一个计算器用户提供了大部分答案,但后来显然删除了(?)。 这里是一个可行的解决方案。 我再次认识到这未必是最好的做法,但它可以在某些情况下派上用场。

模块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显然撤回了答案。



文章来源: How to make print() override work “globally”