python-sys.stdout作为默认函数参数的实现
假设我们有以下虚拟函数:
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之在函数中使用列表作为默认参数
- python3 中print函数参数详解,print(*values, sep=' ', end='\n', file=sys.stdout, flush=False)中参数介绍
- Python 函数的默认参数, 关键字参数的调用
- Python可变参数函数的实现
- Python 函数式编程(高阶函数、把函数作为参数、map()函数、reduce()函数、filter()函数、自定义排序函数、函数返回函数、闭包、匿名函数、装饰器decorator)
- python 函数默认参数值、关键参数
- A Byte of Python 笔记(5)函数:定义、形参、局部变量、默认参数、关键参数
- asp(vbscript)中实现自定义函数的默认参数
- python 笔记 之 函数中默认参数的影响
- Python def函数的定义、使用及参数传递实现代码
- Python标准库:内置函数print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
- 在VBScript中实现-函数/方法名作为参数传入另一个函数
- python把函数作为参数的函数
- Python函数的默认参数
- 函数:使用函数重载及默认参数实现程序
- 第十一篇 Python函数之定义&形参&实参&位置参数&关键字参数&可变长参数&默认参数...
- Python 内建函数 - print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
- Python def函数的定义、使用及参数传递实现代码
- Python——可变类型与不可变类型(即为什么函数默认参数要用元组而非列表)