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 相关文章推荐
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
python 创建弹出式菜单的实现代码
Jul 11 Python
Python实现的生成格雷码功能示例
Jan 24 Python
Python+Django搭建自己的blog网站
Mar 13 Python
python3.4实现邮件发送功能
May 28 Python
python读出当前时间精度到秒的代码
Jul 05 Python
python中pygame安装过程(超级详细)
Aug 04 Python
Python实现TCP通信的示例代码
Sep 09 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
Python requests模块安装及使用教程图解
Jun 30 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 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
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
PHP读取xml方法介绍
2013/01/12 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
JQuery toggle使用分析
2009/11/16 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
node.js中的console用法总结
2014/12/15 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
javascript中this指向详解
2016/04/23 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
Python多进程机制实例详解
2015/07/02 Python
利用python程序帮大家清理windows垃圾
2017/01/15 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
班长自荐书范文
2014/02/11 职场文书
科研课题实施方案
2014/03/18 职场文书
自我鉴定书
2014/03/24 职场文书
工作保证书怎么写
2015/02/28 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书