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

时间:2015-10-02 06:05:08

标签: python coding-style

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

编写pythonic代码的最重要原则之一是"显式优于隐式"。

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

if a:
    print 'eggs'

优于

if a == true:
    print 'spam'

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

3 个答案:

答案 0 :(得分:1)

在上面的代码变量中,'a'可以是任何数据类型int,string,list。所以第一个版本的含义就像它是整数,如果它不是零那么它将进入if循环,如果它是字符串而不是空它将进入if循环等。 第二个版本更可能来自传统语言,如C,C ++等,其中变量更可能是布尔变量,这就是为什么它与'true'进行比较。

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

答案 1 :(得分:1)

这里发生了一些事情。首先,让我们解决问题" truthy"值。在python中,大多数对象都是" truthy",这意味着它们在诸如if thing: do other_thing之类的语句中评估为true。

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

那么为什么这很重要?它可以让你编写更清晰的代码!如果您希望某些内容 不是,则无需确切地检查它是什么。这是一张空名单?好吧,没什么。空字符串?依然没有。哦,我拿回了一把钥匙的字典:价值对?那是的东西!这就是" 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?")

答案 2 :(得分:1)

Pythonic代码的另一个原则是,“简单比复杂更好。”

if语句的重点是根据该语言的规则检查表达式是否真实。 (不可否认,Python的真实性规则比大多数其他语言的规则更复杂。)如果您知道,为了您的if子句,您的表达式的所有可能的真实值都不同于所有可能的假值,然后你就已经明白了。