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的字节编译详解
Sep 20 Python
PyCharm 设置SciView工具窗口的方法
Jan 15 Python
python绘制漏斗图步骤详解
Mar 04 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
Python对列表的操作知识点详解
Aug 20 Python
JupyterNotebook 输出窗口的显示效果调整方法
Apr 13 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
Sep 04 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 Python
python 常用的异步框架汇总整理
Jun 18 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 Python
python pygame 开发五子棋双人对弈
May 02 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 面向对象的一个例子
2011/04/12 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
JavaScript 数组循环引起的思考
2010/01/01 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
Python中实现参数类型检查的简单方法
2015/04/21 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
python实现简单学生信息管理系统
2020/04/09 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
北京某科技有限公司C# .net笔试题
2014/09/27 面试题
九州传奇上机题
2014/07/10 面试题
药学专业毕业生求职信
2013/10/20 职场文书
洗车工岗位职责
2014/03/15 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
学雷锋日活动总结
2015/02/06 职场文书
发票退票证明
2015/06/24 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
Python包argparse模块常用方法
2021/06/04 Python
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫