覆盖内置函数[重复]

2024-01-15

我有一大块使用“print”语句的代码。可以这么说:

print "foo"

and not

print("foo")

我想改变输出。我可以在不更改所有打印行的情况下执行此操作吗?例如通过覆盖函数/语句?


Python directly支持你想做的事:

from __future__ import print_function

任何顶部有该行的模块都会处理print语句作为函数,使代码与 Python 2 和 3 兼容。

这适用just to the print陈述;您不能覆盖其他语句。

这确实意味着您必须使用print()作为该模块中随处可见的函数,但如果您愿意,您也可以提供自己的实现:

from __future__ import print_function
import __builtin__

def print(*args, **kwargs):
    __builtin__.print('Prefixed:', *args, **kwargs)

print('Hello world!')

另一种选择是使用上下文管理器来捕获打印语句,将输出从sys.stdout到您选择的内存文件对象中:

from contextlib import contextmanager
import sys
try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO


@contextmanager
def capture_sys_output():
    caputure_out = StringIO()
    current_out = sys.stdout
    try:
        sys.stdout = caputure_out
        yield caputure_out
    finally:
        sys.stdout = current_out

并包装您想要捕获的任何块print上下文管理器的输出。这是一个为打印行添加前缀的示例:

with capture_sys_output as output:
    print 'Hello world!'

output = output.get_value()
for line in output.splitlines():
    print 'Prefixed:', line

甚至提供一个包装器:

from contextlib import contextmanager
import sys

class Prefixer(object):
    def __init__(self, prefix, orig):
        self.prefix = prefix
        self.orig = orig
    def write(self, text):
        self.orig.write(self.prefix + text)
    def __getattr__(self, attr):
        return getattr(self.orig, attr)     

@contextmanager
def prefix_stdout(prefix):
    current_out = sys.stdout
    try:
        sys.stdout = Prefixer(prefix, current_out)
        yield
    finally:
        sys.stdout = current_out

并用作:

with prefix_stdout('Prefixed: '):
    print 'Hello world!'

但考虑到print语句通常将数据写入stdout分成不同的块;末尾的换行符是separate write.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖内置函数[重复] 的相关文章

随机推荐