跳到内容

boolean-type-hint-positional-argument (FBT001)

v0.0.127 版本加入 · 相关议题 · 查看源码

Derived from the flake8-boolean-trap linter. (源自 flake8-boolean-trap 代码检查器。)

作用

检查函数定义中是否使用了布尔类型的位置参数。判断依据是其类型提示中是否明确包含 bool 作为子类型——例如 boolbool | inttyping.Optional[bool] 等。

为什么这不好?

在函数调用中使用布尔类型的位置参数会造成困扰,因为布尔值的含义对于调用者和后续的代码阅读者来说并不明确。

使用布尔值也会将函数限制为仅有的两种行为,这使得函数在未来难以扩展。

建议通过以下方式重构:为 TrueFalse 的情况分别实现函数、使用 Enum(枚举),或将该参数设为仅关键字参数,以强制调用者在传参时必须显式指定参数名。

定义运算符的魔术方法(Dunder methods)不受此规则限制,setter 方法和 @override 定义同样豁免。

示例

from math import ceil, floor


def round_number(number: float, up: bool) -> int:
    return ceil(number) if up else floor(number)


round_number(1.5, True)  # What does `True` mean?
round_number(1.5, False)  # What does `False` mean?

改为重构为单独的实现

from math import ceil, floor


def round_up(number: float) -> int:
    return ceil(number)


def round_down(number: float) -> int:
    return floor(number)


round_up(1.5)
round_down(1.5)

或者,重构为使用 Enum

from enum import Enum


class RoundingMethod(Enum):
    UP = 1
    DOWN = 2


def round_number(value: float, method: RoundingMethod) -> float: ...

或者,将参数改为仅关键字参数

from math import ceil, floor


def round_number(number: float, *, up: bool) -> int:
    return ceil(number) if up else floor(number)


round_number(1.5, up=True)
round_number(1.5, up=False)

参考