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检测lvs real server状态
Jan 22 Python
Python中Django框架利用url来控制登录的方法
Jul 25 Python
使用rst2pdf实现将sphinx生成PDF
Jun 07 Python
python实现二维码扫码自动登录淘宝
Dec 27 Python
python中装饰器级连的使用方法示例
Sep 29 Python
解决python删除文件的权限错误问题
Apr 24 Python
Django rest framework工具包简单用法示例
Jul 20 Python
python random从集合中随机选择元素的方法
Jan 23 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
Django 静态文件配置过程详解
Jul 23 Python
django使用admin站点上传图片的实例
Jul 28 Python
使用python向MongoDB插入时间字段的操作
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
PHP中显示格式化的用户输入
2006/10/09 PHP
自动分页的不完整解决方案
2007/01/12 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
PHP中用hash实现的数组
2011/07/17 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
广告显示判断
2006/08/31 Javascript
Prototype Hash对象 学习
2009/07/19 Javascript
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
jQuery Easyui快速入门教程
2016/08/21 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
python采集博客中上传的QQ截图文件
2014/07/18 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
恒华伟业笔试面试题
2015/02/26 面试题
十八届三中全会个人学习材料
2014/02/13 职场文书
调解协议书
2014/04/16 职场文书
签约仪式策划方案
2014/06/02 职场文书
工作失误检讨书
2015/01/26 职场文书
离职信范文
2015/06/23 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书