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实现命令行版的火车票查看器
Aug 05 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
Python Pillow Image Invert
Jan 22 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
Python3常见函数range()用法详解
Dec 30 Python
python实现人脸签到系统
Apr 13 Python
Pycharm安装python库的方法
Nov 24 Python
Pycharm 跳转回之前所在页面的操作
Feb 05 Python
python之django路由和视图案例教程
Jul 26 Python
基于PyQT5制作一个桌面摸鱼工具
Feb 15 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/06/28 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
JS提交form表单实例分析
2015/12/10 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
JS实现合并json对象的方法
2017/10/10 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
Python脚本实现虾米网签到功能
2016/04/12 Python
python中map的基本用法示例
2018/09/10 Python
python web框架中实现原生分页
2019/09/08 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
应届毕业生的自我鉴定
2013/11/13 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
民间借贷被告代理词
2015/05/23 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
小学生班干部竞选稿
2015/11/20 职场文书