【发布时间】:2011-05-29 14:29:06
【问题描述】:
是否有 Python 等效/伪等效于 java 的 OutputStream 或 PrintWriter?
我希望能够拥有一个句柄,它代表像 stdout/sterr 这样的流、文件或其他东西(管道、套接字或虚拟接收器),并抽象出它是什么类型的东西,所以我可以将输出发送给它。
我该怎么做?
【问题讨论】:
标签: python abstraction
是否有 Python 等效/伪等效于 java 的 OutputStream 或 PrintWriter?
我希望能够拥有一个句柄,它代表像 stdout/sterr 这样的流、文件或其他东西(管道、套接字或虚拟接收器),并抽象出它是什么类型的东西,所以我可以将输出发送给它。
我该怎么做?
【问题讨论】:
标签: python abstraction
您只需要一个实现文件、管道、流等也实现的方法的对象。例如,当我想分离我的 python 程序并且我想重定向 sys.stderr/sys.stdout 时,我有时会使用这个类:
class Log(object):
"""used for logging for background process"""
def __init__(self, f):
self.f = f
def write(self, s):
self.f.write(s)
self.f.flush()
sys.stdout = sys.stderr = Log(open('/tmp/daemonlog', 'a+'))
【讨论】:
“抽象出它是什么类型”在 Python 中自动发生 - 它被称为“鸭子类型”。只需将任何类文件对象传递给函数,并让它使用类文件对象的接口。
FWIW,标准输入/输出/错误流由sys 模块中的stdin、stdout 和stderr 表示。要获取读写字符串的类文件对象,请使用StringIO 模块。
【讨论】: