sys.stdout 作为默认函数参数
sys.stdout as default function argument
假设我们有以下虚拟函数:
import sys
def writeline(text, stream=sys.stdout):
stream.write(text + '\n')
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<b> = None</b>):
<b>if stream is None:</b>
<b>stream = sys.stdout</b>
stream.write(text + '\n')
通常,将 immutable 对象设置为默认参数(如 None
、False
、(1,)
等可能是个好建议.).只有在极少数情况下才会在 Python.
中故意使用不可变的(或可能更改引用的)
如果您确定不会将 sys.stdout
重定向到文件、管道等。它是安全的。
当对命名参数的常数值有疑问时最常使用的成语是将参数设置为None
,所以解决总是完成在运行时针对调用时的当前值:
def writeline(text, stream=None):
if stream is None:
stream = sys.stdout
stream.write(text + '\n')
如果您正在使用 Python 3 的打印功能,如果 file
参数是 None
,输出将照常打印到 stdout
。所以你可以像这样设置默认值 None
:
def write_something(items, outfile=None):
for item in items:
print(item, file=outfile)
假设我们有以下虚拟函数:
import sys
def writeline(text, stream=sys.stdout):
stream.write(text + '\n')
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<b> = None</b>):
<b>if stream is None:</b>
<b>stream = sys.stdout</b>
stream.write(text + '\n')
通常,将 immutable 对象设置为默认参数(如 None
、False
、(1,)
等可能是个好建议.).只有在极少数情况下才会在 Python.
如果您确定不会将 sys.stdout
重定向到文件、管道等。它是安全的。
当对命名参数的常数值有疑问时最常使用的成语是将参数设置为None
,所以解决总是完成在运行时针对调用时的当前值:
def writeline(text, stream=None):
if stream is None:
stream = sys.stdout
stream.write(text + '\n')
如果您正在使用 Python 3 的打印功能,如果 file
参数是 None
,输出将照常打印到 stdout
。所以你可以像这样设置默认值 None
:
def write_something(items, outfile=None):
for item in items:
print(item, file=outfile)