python-sys.stdout作为默认函数参数的实现


Posted in Python onFebruary 21, 2020

假设我们有以下虚拟函数:

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 output
writeline('bar')

鉴于Python在定义时评估了函数的默认参数,将sys.stdout设置为默认参数是安全的,还是会产生意想不到的副作用?

最佳答案

我想到的一个问题是,您有时有时想自己将sys.stdout重定向到文件(或管道,设备等).

例如,您的主程序可能如下所示:

if __name__ == '__main__':
 if len(sys.argv) > 1:
  sys.stdout = open(sys.argv[1],'w')
 try:
  # ... run the program
 finally:
  if len(sys.argv) > 1:
   sys.stdout.close()

如果您希望程序在提及一个文件时将其记录到一个文件中(例如python3 file.py logfile.log),这可能会很有用.现在,由于您设置了sys.stdout,因此您的writeline方法将不会注意到该修改.

因此,我认为写这样更安全:

def writeline(text, stream = None):
 if stream is None:
  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' object has no attribute 'write'

显然默认输出流不能None,所以我对Python说:

sys.stdout = use_the_default_one()

解决方案

重新分配给sys.__stdout__。

来自文档

在程序开始时包含stdin,stderr和stdout的原始值。它们在完成过程中使用,并且无论是否已重定向sys.std *对象,将其打印到实际的标准流都很有用。

或者你可以做

print(output, file=myoutputfile)

并避免该问题。

以上这篇 python-sys.stdout作为默认函数参数的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中将阿拉伯数字转换成中文的实现代码
May 19 Python
python中os操作文件及文件路径实例汇总
Jan 15 Python
Python中Class类用法实例分析
Nov 12 Python
Python 搭建Web站点之Web服务器网关接口
Nov 06 Python
使用python实现tcp自动重连
Jul 02 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
python2 与 pyhton3的输入语句写法小结
Sep 10 Python
python中的&&及||的实现示例
Aug 07 Python
python基于opencv检测程序运行效率
Dec 28 Python
使用Python pip怎么升级pip
Aug 11 Python
python 实现性别识别
Nov 21 Python
python源码剖析之PyObject详解
May 18 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 #Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 #Python
python ffmpeg任意提取视频帧的方法
Feb 21 #Python
Python实现自动访问网页的例子
Feb 21 #Python
解决Python pip 自动更新升级失败的问题
Feb 21 #Python
python利用百度云接口实现车牌识别的示例
Feb 21 #Python
在python3中实现更新界面
Feb 21 #Python
You might like
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
VBScript版代码高亮
2006/06/26 Javascript
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
微信JS接口大全
2016/08/25 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
2017/10/20 jQuery
使用koa2创建web项目的方法步骤
2019/03/12 Javascript
python根据经纬度计算距离示例
2014/02/16 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
Python实现自动发送邮件功能
2021/03/02 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
利用python实现汉诺塔游戏
2021/03/01 Python
Python与C/C++的相互调用案例
2021/03/04 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
大学生素质拓展活动方案
2014/02/11 职场文书
2015年体育部工作总结
2015/04/02 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫