函数调用位于默认参数中 (B008)
源自 flake8-bugbear linter。
作用
检查函数默认参数中的函数调用。
为什么这不好?
在默认参数中使用的任何函数调用仅会在定义时执行一次。返回值将被该函数的所有调用重用,这可能会导致意外行为。
具有不可变类型注解的参数将被此规则忽略。默认参数是原始类型为不可变的 NewType
调用的参数也将被忽略。
标准库之外的调用和类型可以使用 lint.flake8-bugbear.extend-immutable-calls
配置选项标记为此规则的例外。
示例
def create_list() -> list[int]:
return [1, 2, 3]
def mutable_default(arg: list[int] = create_list()) -> list[int]:
arg.append(4)
return arg
建议改为
def better(arg: list[int] | None = None) -> list[int]:
if arg is None:
arg = create_list()
arg.append(4)
return arg
如果使用单例是故意的,请将结果调用分配给模块级变量,并在默认参数中使用该变量
ERROR = ValueError("Hosts weren't successfully added")
def add_host(error: Exception = ERROR) -> None: ...