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 xlrd读取excel日期类型的2种方法
Apr 28 Python
python读写ini配置文件方法实例分析
Jun 30 Python
用tensorflow搭建CNN的方法
Mar 05 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
使用python绘制二维图形示例
Nov 22 Python
学python最电脑配置有要求么
Jul 05 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
Python实现查询剪贴板自动匹配信息的思路详解
Jul 09 Python
用Python爬取英雄联盟的皮肤详细示例
Dec 06 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 进行手机 APP 开发(API 接口开发)
2014/08/11 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
yii中widget的用法
2014/12/03 PHP
js字符编码函数区别分析
2008/06/05 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
canvas简单快速的实现知乎登录页背景效果
2017/05/08 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
python使用urllib模块开发的多线程豆瓣小站mp3下载器
2014/01/16 Python
python中反射用法实例
2015/03/27 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
详解Django中间件执行顺序
2018/07/16 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
详解Python3中ceil()函数用法
2019/02/19 Python
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
餐饮业会计岗位职责
2013/12/19 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
校长四风对照检查材料
2014/09/27 职场文书
抗洪救灾标语
2014/10/08 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
JS setTimeout与setInterval的区别
2022/04/20 Javascript
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang