【发布时间】:2016-11-27 07:58:26
【问题描述】:
我在使用 PyYAML 从 yaml 文件输入的打印信息时遇到问题。我正在尝试减少行数,而不影响功能。在某些运行中,输出必须附加到文件中,在其他运行中必须附加到标准输出。
一开始我在函数processData中多次使用了这个:
if logName:
fp = open(logName, 'a')
else:
fp = sys.stdout
print(........, file=fp)
print(........, file=fp)
if logName:
fp.close()
这行得通,但缺点是在出现问题时不使用 with 语句。
实际的问题不是复杂的打印语句,而是我自己
1) 打印到文件或 sys.stdout 时不想重复代码
2) 想要使用 with 语句,以便在出现打印错误时关闭文件
3)有几个这样的块,我不想为每个块调用不同的函数,从而防止代码重复
然后我尝试的是:
def processData(yamlData, logName=None):
......
with open(logName, 'a') if logName else sys.stdout as fp:
print(........, file=fp)
print(........, file=fp)
.....
with open(logName, 'a') if logName else sys.stdout as fp:
print(........, file=fp)
print(........, file=fp)
如果没有 logName,则此错误为“ValueError: I/O operation on closed file”。关于如何在没有原始副本的情况下使其正常工作的任何建议?我可以重新打开 sys.stdout 吗?
【问题讨论】:
-
您可以使用记录器代替打印。这是最佳做法。
-
谢谢,我会调查的。很多有用的包,时间太少了……
-
@Brad 别再看了!输入 Python,这是第一种语言和标准库,其中 “应该有一个,并且最好只有 一个明显的方法来做到这一点”! 如果标准库中有一些功能,你可以打赌,他们很难让它涵盖每个典型用例。
-
(OT) 顺便说一句,那是毁灭公爵的参考吗? ;)
标签: python with-statement