跳到内容

函数调用位于默认参数中 (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: ...

Options (选项)