python-sys.stdout作为默认函数参数的实现
作者:codeday 发布时间:2022-11-23 02:50:35
假设我们有以下虚拟函数:
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)
并避免该问题。
来源:https://codeday.me


猜你喜欢
- 一、pytorch finetuning 自己的图片进行训练这种读取图片的方式用的是torch自带的 ImageFolder,读取的文件夹必
- 接触pandas之后感觉它的很多功能似乎跟numpy有一定的重复,尤其是各种运算。不过,简单的了解之后发现在数据管理上pandas有着更为丰
- 我在网站上设置了邮件列表功能,实现用户自动订阅和发送,但很多用户输入和提交的邮件地址格式都是无效的,无法处理。请问如何解决这一问题?&nbs
- 表单内有两个提交按钮,要实现当点击不同的提交按钮时,分别进行两个不同的处理过程,在这里有实现表单多按钮提交action的处理方法分享给大家。
- 需要安装的python库使用python编写程序进行测试MQTT的发布和订阅功能。首先要安装:pip install paho-mqtt测试
- jwt详解Django之auth模块(用户认证)jwt的作用json web token,一般用于用户认证就是做用户登录的(前后端分离/微信
- 背景:今天同事写代码,用python读取一个四五百兆的文件,然后做一串逻辑上很直观的处理。结果处理了一天还没有出来结果。问题出在哪里呢?解决
- 导语:用 Python 读取图片的像素值,然后输出到 Excel 表格中,最终形成一幅像素画,也就是电子版的十字绣了。基本思路实现这个需求的
- 前言最近在解决一些算法优化的问题,为了实时性要求,必须精益求精的将资源利用率用到极致。同时对算法中一些处理进行多线程或者多进程处理。在对代码
- 大家都知道,在SQL脚本中设置多字段做关键字相对比较简单,例:primary key(id1,id2) ,但用脚本建数据库就比较麻烦了。那么
- 一、常用按键按键说明Keys.BACK_SPACE回退键(BackSpace)Keys.TAB制表键(Tab)Keys.ENTER回车键(E
- 之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片。最近做项目,打算换个方法上传图片。Android发展到现在,Okhttp
- 本文实例为大家分享了Python实现神经网络算法及应用的具体代码,供大家参考,具体内容如下首先用Python实现简单地神经网络算法:impo
- 前言:前面的一章我们展示了选择结构的三种基本形式,并给出了实例演示,但是大家在编写代码过程中仍然要注意一些细节,尤其是代码块的缩进,这对if
- 前段时间在开发雨哲树网程序的时候,遇到需要转换地址中的参数,需要用到简单可逆运算的加密功能。在网上找了很多都不理想。因为我需要的这个可逆运算
- 前言:其实很简单!举一个简单的例子!这是一个简单的显示时刻的温度折线图:from matplotlib import pyplot as p
- 本文实例讲述了php实现压缩多个CSS与JS文件的方法。分享给大家供大家参考。具体实现方法如下:1. 压缩css<?php
- MySQL索引优化之分页探索表结构CREATE TABLE `demo` ( `id` int(11) NOT NULL AUT
- Linux添加mysql系统环境变量昨天安装完mysql后,直接在export PATH上面一行,增加了export PATH=/usr/l
- 目录楔子faker使用方法基本使用地理信息类基础信息类计算机基础、Internet信息类网络基础信息类浏览器信息类数字类文本、加密类时间信息