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 相关文章推荐
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
window下eclipse安装python插件教程
Apr 24 Python
python中logging库的使用总结
Oct 18 Python
wxPython实现窗口用图片做背景
Apr 25 Python
Python装饰器知识点补充
May 28 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
python框架django项目部署相关知识详解
Nov 04 Python
python实现坦克大战
Apr 24 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 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/07/05 PHP
详解Window7 下开发php扩展
2015/12/31 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
python pillow模块使用方法详解
2019/08/30 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
英国绿色商店:Natural Collection
2019/05/03 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
优秀的毕业生的自我评价
2013/12/12 职场文书
给校长的一封检讨书
2014/09/20 职场文书
毕业证代领委托书
2014/09/26 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
工作失职检讨书
2015/01/26 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
如何利用golang运用mysql数据库
2022/03/13 Golang