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编写android截屏脚本双击运行即可
Jul 21 Python
python中readline判断文件读取结束的方法
Nov 08 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
深入浅析python继承问题
May 29 Python
python中nan与inf转为特定数字方法示例
May 11 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
基于python指定包的安装路径方法
Oct 27 Python
Python Web框架之Django框架Form组件用法详解
Aug 16 Python
使用python实现kNN分类算法
Oct 16 Python
Python更新所有已安装包的操作
Feb 13 Python
Python如何根据时间序列数据作图
May 12 Python
python 使用三引号时容易犯的小错误
Oct 21 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读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
php调用shell的方法
2014/11/05 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
python中requests模块的使用方法
2015/04/08 Python
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
python操作kafka实践的示例代码
2019/06/19 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
python实现拼接图片
2020/03/23 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
英国领先的男士美容护发用品公司:Mankind
2016/08/31 全球购物
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
化学实验员岗位职责
2013/12/28 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
雏鹰争章活动总结
2014/05/09 职场文书
人事任命书怎么写
2014/06/05 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
补充协议书
2015/01/28 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
一起来学习Python的元组和列表
2022/03/13 Python
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技