跳到内容

boolean-default-value-positional-argument (FBT002)

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

作用

检查函数定义中是否使用了布尔位置参数,这由是否存在布尔默认值决定。

为什么这不好?

使用布尔位置参数调用函数会令人困惑,因为布尔值的含义对于调用者和代码的未来阅读者来说都不明确。

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

相反,考虑将代码重构为针对 TrueFalse 情况的单独实现,使用 Enum,或将该参数设为仅关键字参数,以强制调用者在提供参数时明确。

示例

from math import ceil, floor


def round_number(number, up=True):
    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):
    return ceil(number)


def round_down(number):
    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, method):
    return ceil(number) if method is RoundingMethod.UP else floor(number)


round_number(1.5, RoundingMethod.UP)
round_number(1.5, RoundingMethod.DOWN)

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

from math import ceil, floor


def round_number(number, *, up=True):
    return ceil(number) if up else floor(number)


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

参考