Pythonic仅当变量不是None时才进行if语句比较的方法

2024-05-12 15:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

如果阻塞,有没有更类似于Python的方法

def is_notification_needed(request: RiverPreference, gauge: Gauge) -> bool:
    """
    Decides whether an email should be sent to the user or not based on their provided preferences.
    :param request: RiverPreference dataclass
    :param gauge: Gauge dataclass
    :returns: boolean
    """
    for preference in request:
        if preference.level and preference.trend and preference.level >= gauge.level and preference.trend == gauge.trend:
            return True
        elif preference.level and not preference.trend and preference.level >= gauge.level:
            return True
        elif preference.trend and not preference.level and preference.trend == gauge.level:
            return True
        return False

preference.trendpreference.level默认为None,当用户不想设置它时。我想能够检查这些值与仪表值,只有当它们被设置时


Tags: and方法truereturnparamrequestnotlevel
3条回答

首先,pythonic的比较方法是is not None,如果您的值可能是falsy(0),这一点很重要

第二,你的缩进看起来不对劲,逻辑上有一个输入错误,但我认为你的目标是,如果满足任何偏好的所有条件,就返回True,否则返回False,通过检查否定,这会更简单

    for preference in request:
        if preference.level is not None and preference.level < gauge.level:
            continue
        if preference.trend is not None and preference.trend != gauge.trend:
            continue
        return True  # NB: treats all-None as a match
    return False

首先,最好显式地与None进行比较,而不是“滥用”布尔值None。请记住Python的Zen(PEP-20)中的“显式优于隐式”。就是

if preference.level is not None and ...

总比

if preference.level and ...

另一方面,通过执行以下操作,可以利用None具有布尔False值的事实:

if (preference.level or 0) >= gauge.level:

而不是:

if preference.level and preference.level >= gauge.level:

当然,您应该指定适当的值,而不是0(取决于gauge.level可以有哪些值);这只是一个例子

使用or运算符为变量提供默认值,该变量可以是None(或False,或任何其他布尔值的伪等价物),实际上在Python程序中非常常用,我将其称为“Pythonic”方式来表示

顺便说一下,你的for循环是没有意义的,因为你的循环体总是在第一次通过循环时返回

我不知道这是否更像Python,但我确实发现它更容易一眼就能理解


def is_notification_needed(request: RiverPreference, gauge: Gauge) -> bool:
    """
    Decides whether an email should be sent to the user or not based on their provided preferences.
    :param request: RiverPreference dataclass
    :param gauge: Gauge dataclass
    :returns: boolean
    """
    preference = request[0]
    if preference.trend is None:
        if preference.level is None:
            return False
        return preference.trend >= gauge.level
    elif preference.level is None:
        return preference.trend == gauge.level
    return preference.level >= gauge.level and preference.trend == gauge.trend

这里的主要原则是尽早消除None情况,然后依赖于我们知道这些值已定义的事实,在后续代码中使用

如果由于其他原因,值也可能是,则可能将is None更改为不太具体的值

相关问题 更多 >