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 EOL while scanning string literal问题解决方法
Sep 18 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
Python中set与frozenset方法和区别详解
May 23 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
使用Python和Scribus创建一个RGB立方体的方法
Jul 17 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
基于python实现可视化生成二维码工具
Jul 08 Python
解决python打开https出现certificate verify failed的问题
Sep 03 Python
如何将json数据转换为python数据
Sep 04 Python
Python torch.flatten()函数案例详解
Aug 30 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 Mysql类 可以参考学习熟悉下
2009/06/21 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
php构造方法中析构方法在继承中的表现
2016/04/12 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
js不是基础的基础
2006/12/24 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
RC4文件加密的python实现方法
2015/06/30 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python Socket传输文件示例
2017/01/16 Python
python opencv摄像头的简单应用
2019/06/06 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
简述安装Slackware Linux系统的过程
2012/05/08 面试题
财务会计专业应届毕业生求职信
2013/10/18 职场文书
两只小狮子教学反思
2014/02/05 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
欢迎家长标语
2014/10/08 职场文书
见习报告的格式
2014/10/31 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
期末考试复习计划
2015/01/19 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
如何撰写创业策划书
2019/06/27 职场文书