有时,使用默认参数(即空列表)似乎很自然.然而,Python在这些情况下会出现意外行为.
例如,我有一个功能:
def my_func(working_list = []):
working_list.append("a")
print(working_list)
Run Code Online (Sandbox Code Playgroud)
第一次使用默认值调用它将起作用,但之后的调用将使用不断更新的列表.
那么,获得我想要的行为的pythonic方法是什么(每个调用都有一个新的列表)?
def save_file(self, outputfilename = self.image_filename):
self.file.read(outputfilename)
....
Run Code Online (Sandbox Code Playgroud)
NameError: name 'self' is not defined
在第一行给出.似乎Python不接受它.如何重写代码以免引发异常?
目前,当我无法在函数签名中分配默认参数和/或已经具有含义时,我会使用此策略。None
from typing import Optional
DEFAULT = object()
# `None` already has meaning.
def spam(ham: Optional[list[str]] = DEFAULT):
if ham is DEFAULT:
ham = ['prosciutto', 'jamon']
if ham is None:
print('Eggs?')
else:
print(str(len(ham)) + ' ham(s).')
Run Code Online (Sandbox Code Playgroud)
错误:
Failed (exit code: 1) (2607 ms)
main.py:7: error: Incompatible default for argument "ham" (default has type "object", argument has type "Optional[List[str]]")
Found 1 error in 1 file (checked 1 source file)
Run Code Online (Sandbox Code Playgroud)
ham
而不出现错误?或者DEFAULT = object() …