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 元类使用说明
Dec 18 Python
Python写的创建文件夹自定义函数mkdir()
Aug 25 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
python交换两个变量的值方法
Jan 12 Python
numpy np.newaxis 的实用分享
Nov 30 Python
利用Tensorflow的队列多线程读取数据方式
Feb 05 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
keras读取h5文件load_weights、load代码操作
Jun 12 Python
使用python脚本自动生成K8S-YAML的方法示例
Jul 12 Python
Python读写压缩文件的方法
Jul 30 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 Python
Python turtle编写简单的球类小游戏
Mar 31 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
Destoon模板制作简明教程
2014/06/20 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
PHP学习笔记之session
2018/05/06 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
ppk谈JavaScript style属性
2008/10/10 Javascript
JS跨域代码片段
2012/08/30 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
layui表格实现代码
2017/05/20 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
python实现排序算法
2014/02/14 Python
python实现dict版图遍历示例
2014/02/19 Python
Python Queue模块详解
2014/11/30 Python
python基础教程项目二之画幅好画
2018/04/02 Python
Python tkinter常用操作代码实例
2020/01/03 Python
pytorch构建多模型实例
2020/01/15 Python
python脚本定时发送邮件
2020/12/22 Python
台湾生鲜宅配:大口市集
2017/10/14 全球购物
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
几个人围成一圈的问题
2013/09/26 面试题
财务部经理岗位职责
2014/02/03 职场文书
地理教师岗位职责
2014/03/16 职场文书
操行评语大全
2014/04/30 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
增值税发票丢失证明
2015/06/19 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
python playwright 自动等待和断言详解
2021/11/27 Python