python-sys.stdout作为默认函数参数的实现
假设我们有以下虚拟函数:
importsys defwriteline(text,stream=sys.stdout): stream.write(text+' ') withopen('/path/to/file','w')asf: #writesto/path/to/file writeline('foo',f) #writestostandardoutput writeline('bar')
鉴于Python在定义时评估了函数的默认参数,将sys.stdout设置为默认参数是安全的,还是会产生意想不到的副作用?
最佳答案
我想到的一个问题是,您有时有时想自己将sys.stdout重定向到文件(或管道,设备等).
例如,您的主程序可能如下所示:
if__name__=='__main__': iflen(sys.argv)>1: sys.stdout=open(sys.argv[1],'w') try: #...runtheprogram finally: iflen(sys.argv)>1: sys.stdout.close()
如果您希望程序在提及一个文件时将其记录到一个文件中(例如python3file.pylogfile.log),这可能会很有用.现在,由于您设置了sys.stdout,因此您的writeline方法将不会注意到该修改.
因此,我认为写这样更安全:
defwriteline(text,stream=None): ifstreamisNone: stream=sys.stdout stream.write(text+' ')
通常,最好将不可变对象设置为默认参数(例如None,False,(1)等).只有在极少数情况下,Python中才会使用不可变的变量(或可能更改引用的变量).
但是,如果您确定不会将sys.stdout重定向到文件,管道等,则是安全的.
补充拓展:Python实现将sys.stdout还原为默认值
我想将输出写入文件,因此我做了
sys.stdout=open(outfile,'w+')
但是后来我想在写入文件后打印回控制台
sys.stdout.close()
sys.stdout=None
我得到了
AttributeError:'NoneType'objecthasnoattribute'write'
显然默认输出流不能None,所以我对Python说:
sys.stdout=use_the_default_one()
解决方案
重新分配给sys.__stdout__。
来自文档
在程序开始时包含stdin,stderr和stdout的原始值。它们在完成过程中使用,并且无论是否已重定向sys.std*对象,将其打印到实际的标准流都很有用。
或者你可以做
print(output,file=myoutputfile)
并避免该问题。
以上这篇python-sys.stdout作为默认函数参数的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。