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 相关文章推荐
MAC中PyCharm设置python3解释器
Dec 15 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
Python打印输出数组中全部元素
Mar 13 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
在Python中定义一个常量的方法
Nov 10 Python
基于python中__add__函数的用法
Nov 25 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
python列表推导式入门学习解析
Dec 02 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
django日志默认打印request请求信息的方法示例
May 17 Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 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自定文件保存session的方法
2014/12/10 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
Javascript实现的分页函数
2007/02/07 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
Python下使用Psyco模块优化运行速度
2015/04/05 Python
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
Python字符串的常见操作实例小结
2019/04/08 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
意大利奢侈品网站:Italist
2016/08/23 全球购物
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
Linux的文件类型
2012/03/07 面试题
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
教师党的群众路线对照检查材料
2014/09/24 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis