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 Tkinter简单布局实例教程
Sep 03 Python
python持久性管理pickle模块详细介绍
Feb 18 Python
浅析Python中else语句块的使用技巧
Jun 16 Python
PyQt5每天必学之工具提示功能
Apr 19 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
Python读写docx文件的方法
May 08 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
python绘制雪景图
Dec 16 Python
通过Python实现一个简单的html页面
May 16 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
Django如何继承AbstractUser扩展字段
Nov 27 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产生动态的影像图
2006/10/09 PHP
PHP常用代码
2006/11/23 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
PHP之header函数详解
2021/03/02 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
WEB前端设计师常用工具集锦
2014/12/09 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
员工拾金不昧表扬信
2014/01/09 职场文书
绿色环保演讲稿
2014/05/10 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
情人节活动总结范文
2015/02/05 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
Python必备技巧之函数的使用详解
2022/04/04 Python