假设我们有以下虚拟函数: import sys def writeline(text, stream=sys.stdout): stream.write(text + ) with open(/path/to/file, w) as f: # writes to /path/to/file writeline(foo, f) # writes to standard outputwriteline(bar) 鉴于Python在定义时评估
假设我们有以下虚拟函数:
鉴于Python在定义时评估了函数的默认参数,将sys.stdout设置为默认参数是安全的,还是会产生意想不到的副作用? 最佳答案 我想到的一个问题是,您有时有时想自己将sys.stdout重定向到文件(或管道,设备等).
例如,您的主程序可能如下所示:
如果您希望程序在提及一个文件时将其记录到一个文件中(例如python3 file.py logfile.log),这可能会很有用.现在,由于您设置了sys.stdout,因此您的writeline方法将不会注意到该修改. 因此,我认为写这样更安全:
通常,最好将不可变对象设置为默认参数(例如None,False,(1)等).只有在极少数情况下,Python中才会使用不可变的变量(或可能更改引用的变量). 但是,如果您确定不会将sys.stdout重定向到文件,管道等,则是安全的. 补充拓展:Python 实现将sys.stdout还原为默认值 我想将输出写入文件,因此我做了
但是后来我想在写入文件后打印回控制台
我得到了
显然默认输出流不能None,所以我对Python说:
解决方案 重新分配给sys.__stdout__。 在程序开始时包含stdin,stderr和stdout的原始值。它们在完成过程中使用,并且无论是否已重定向sys.std *对象,将其打印到实际的标准流都很有用。 或者你可以做
并避免该问题。 |
2019-06-18
2019-07-04
2021-05-23
2021-05-27
2021-05-27