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.