【问题标题】:Pythonic Convention on When to Return None [duplicate]关于何时返回无的 Pythonic 约定
【发布时间】:2014-11-24 19:45:27
【问题描述】:

我正在寻找关于何时适合和/或希望从 Python 函数返回 None 而不是空列表或零长度字符串的良好约定的指导?

例如,现在,我正在编写一个 Python 类来连接 GIT(暂时不用担心为什么我必须从头开始编写它),并且有几个函数返回值。以一个名为“get_tags”的函数为例。通常,它返回一个列表,但是,如果 repo 中还没有标签,是返回一个空列表还是 None 更好?

我意识到对此会有多种观点,这就是我问这个问题的原因。我敢肯定两者都有优点和缺点,这是我正在寻找的信息。

这方面有一般惯例吗?

【问题讨论】:

  • 已经讨论过here
  • 如果你的函数应该返回一个标签列表,而要返回的标签数量恰好为零,它应该返回一个空列表。然后,无论调用该函数,都可能不必以不同的方式处理特殊情况。
  • 我很难想到None 比空列表更有优势的情况。另一方面,空列表允许您编写诸如my_list.extend(get_tags(...)) 之类的代码,因为get_tags 旨在始终返回一个列表。我的感觉(它本身并不是一个真正的约定)是,如果函数调用中发生异常情况,可能会返回 None,但您不希望出于任何原因使用异常。
  • @kiran.koduru,这是相关的,但不同。这篇文章询问是否返回 None 或其他带有 False 真实性的东西,例如 []""
  • 我会抛出我的经验法则:如果你的函数通常返回一个字符串,返回""。如果它通常返回一个列表,则返回[]。否则返回None

标签: python python-2.7 python-3.x ipython


【解决方案1】:

get_tags 函数返回的数据最常见的用途是什么?我会假设在某些时候你会想要迭代它。考虑以下几点:

列表、元组和字典

# returning a list
for tag in get_tags():
    print tag

# returning None
tags = get_tags()
if tags is not None:
    for tag in tags:
        print tag

在上面的示例中,返回 None 比返回空列表更乏味且可读性更低,因为您必须在尝试迭代之前检查 tags 是否是有效的可迭代对象。空列表是有效的可迭代对象,不需要检查。字典和元组类似。

字符串

对于字符串,我发现自己在进行字符串操作或搜索最常返回字符串的结果:

import re

description = commit.get_description().lower()
# get all JIRA issues
for project_name, issue_id in re.findall(r'(\w+)-(\d+)', s):
    jira.close_issue(project_name, issue_id)

# vs.

description = commit.get_description()
if description:
    description = description.lower()
    for project_name, issue_id in re.findall(r'(\w+)-(\d+)', s):
        jira.close_issue(project_name, issue_id)

类的实例

在存在存在测试的情况下,为类的实例返回 None 是有意义的。

# using xml.etree.ElementTree as an example,
# the .find() method of an XML element will return None if
# an Element is not found
my_tag = root.find('my-tag')
if my_tag is not None:
    do_something_with_my_tag(my_tag)

总结

返回值应该实现所有正常使用的预期方法,即duck typing(当然,最后一种情况除外,None 通常更适合实例)。

【讨论】:

  • 很棒的总结!谢谢!
【解决方案2】:

我会说如果函数应该返回一个对象,那么就返回 None。如果您的函数应该返回“本机”类型(字符串、整数、列表、字典等),则返回“”、0、[]、{}等...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    相关资源
    最近更新 更多