boolean-type-hint-positional-argument (FBT001)
Derived from the flake8-boolean-trap linter. (源自 flake8-boolean-trap 代码检查器。)
作用
检查函数定义中是否使用了布尔类型的位置参数,根据是否包含类型提示(其中包含 bool
作为明显的子类型)来确定,例如 bool
、bool | int
、typing.Optional[bool]
等。
为什么这不好?
使用布尔位置参数调用函数会让人困惑,因为布尔值的含义对于调用者和未来的代码阅读者来说并不清楚。
使用布尔值还会将函数限制为仅两种可能的行为,这使得该函数在未来难以扩展。
相反,考虑将代码重构为 True
和 False
情况的单独实现,使用 Enum
,或者将参数设为仅关键字参数,以强制调用者在提供参数时明确说明。
定义运算符的 Dunder 方法以及 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)