Python 显式条件检查与隐式条件检查相比

Python explicit condition checking compared to implicit

不确定这是否属于 SO,如果确实如此,请社区版主将其移至相应的网络网站。

编写 Pythonic 代码的最重要原则之一是 "Explicit is better than implicit"。

在很多地方,我看到在检查真值时的建议:

if a:
    print 'eggs'

优于

if a == true:
    print 'spam'

第二种方法显然更明确(或者是?),不确定为什么第一种方法受到青睐。我个人喜欢第一种方法,因为它更少而且(可以说)更清晰的代码。这是个人选择的问题还是我在这里遗漏了什么?

上面代码中的变量'a'可以是任意数据类型int、string、list。所以第一个版本的意思是如果它是整数并且如果它不为零那么它将进入 if 循环,如果它是字符串而不是空它将进入 if 循环等。 第二个版本更有可能取自 C、C++ 等传统语言,其中变量更可能是布尔变量,这就是将其与 'true'.

进行比较的原因

所以大多数使用 python 的人都会喜欢第一个版本,因为它更通用。

这里发生了几件事。首先,让我们处理 "truthy" 值。在 python 中,大多数对象是 "truthy",这意味着它们在 if thing: do other_thing.

等语句中的计算结果为真

实际上很少有对象是 "falsey",如文档所述 here(我知道,Python 2.4 文档...别担心,它仍然有效)。

为什么这很重要?它可以让您编写更清晰的代码!如果您期望某事 不是 ,则无需检查到底是什么。这是一个空列表?好吧,这没什么。空字符串?依然没有。哦,我找回了一本有 key:value 对的字典?那是东西!这就是 "Pythonic" 的用武之地——这是社区制定的惯例。每个人都认为它有意义并且看起来更好,所以它被卡住了。

这使您的代码具有很大的灵活性。你不必检查一个对象的类型,你只需要知道它是否包含数据。

如果您真的很关心一个对象是否等于另一个对象,您应该只检查 ==。

示例:

def check_shopping_list(shopping_list):
    if shopping_list:  # No need to check len(), just that it has contents
        for item in shopping_list:
            pass
    else:
        raise EmptyShoppingList("You should really add SPAM to your list")


def validate_input(input):
    if not input:  # catches empty inputs
        raise MissingInput("Please try again")
    else:
        print("Validated!")


def read_file(file_name):
    if os.path.exists(file_name):  # returns True/False, but we don't have to explicitly state that
        with open(file_name) as doc:
            pass
    else:
        print("That file doesn't exist, do you want to create it?")

Pythonic 代码的另一个原则是,"Simple is better than complex."

if 语句的全部意义在于根据该语言的规则检查表达式是否为真。 (诚​​然,Python 的真值规则比大多数其他语言的规则更复杂。)如果您知道,就 if 子句而言,表达式的所有可能真值都是不同的从所有可能的错误值中,那么你已经像你需要的那样明确了。