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实现模拟按键,自动翻页看u17漫画
Mar 17 Python
python简单判断序列是否为空的方法
Jun 30 Python
python实现下载文件的三种方法
Feb 09 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
Tensorflow 同时载入多个模型的实例讲解
Jul 27 Python
python中open函数的基本用法示例
Sep 07 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
python音频处理的示例详解
Dec 23 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 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
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
基于ExtJs在页面上window再调用Window的事件处理方法
2017/07/26 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
python3中property使用方法详解
2019/04/23 Python
python代码中怎么换行
2020/06/17 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
纽约海:Sea New York
2018/11/04 全球购物
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
如何开发一个JQuery插件
2016/07/28 面试题
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
药学职务聘任书
2014/03/29 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
商业项目策划方案
2014/06/05 职场文书
公司演讲稿开场白
2014/08/25 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
2015年采购工作总结
2015/04/10 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
Github 使用python对copilot做些简单使用测试
2022/04/14 Python