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调用cmd命令行制作刷博器
Jan 13 Python
python遍历文件夹并删除特定格式文件的示例
Mar 05 Python
Python中使用异常处理来判断运行的操作系统平台方法
Jan 22 Python
Python自定义线程类简单示例
Mar 23 Python
详解python中@的用法
Mar 27 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
Django如何将URL映射到视图
Jul 29 Python
opencv 获取rtsp流媒体视频的实现方法
Aug 23 Python
python返回数组的索引实例
Nov 28 Python
python numpy 反转 reverse示例
Dec 04 Python
Python3 pickle对象串行化代码实例解析
Mar 23 Python
理解深度学习之深度学习简介
Apr 14 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
yii框架源码分析之创建controller代码
2011/06/28 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
js实现获取焦点后光标在字符串后
2014/09/17 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
Python3解释器知识点总结
2019/02/19 Python
Python实现微信机器人的方法
2019/09/06 Python
python烟花效果的代码实例
2020/02/25 Python
解决python对齐错误的方法
2020/07/16 Python
Python grpc超时机制代码示例
2020/09/14 Python
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
介绍一下linux的文件系统
2012/03/20 面试题
大课间活动实施方案
2014/03/06 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL