gpt4 book ai didi

python - 用 with 语句关闭后重新打开 sys.stdout

转载 作者:行者123 更新时间:2023-11-28 16:20:13 24 4
gpt4 key购买 nike

我在打印使用 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) 有几个这样的 block ,我不想为每个 block 调用不同的函数,这样可以防止代码重复

然后我尝试的是:

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 吗?

最佳答案

您可以在类中“包装”sys.stdout,以防止它首先被关闭。

with 语句分别在开始和结束时对该类的实例调用 __enter____exit__,所以只需确保 __exit__ 什么都不做:

class StdOut:
def __enter__(self):
return sys.stdout

def __exit__(self, typ, val, trace):
pass

stdout = StdOut()

然后使用 stdout 而不是 sys.stdout

关于python - 用 with 语句关闭后重新打开 sys.stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40826895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com