关于何时返回的Pythonic公约无

时间:2014-11-24 19:45:27

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

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

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

我意识到会有多个观点,我想我为什么要问这个问题。我确信两者都有专业和有利,这就是我正在寻找的信息。

对此有一般性约定吗?

2 个答案:

答案 0 :(得分: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通常更适合实例的最后一种情况之外)。

答案 1 :(得分:0)

我会说如果函数应该返回一个对象,那么返回None。如果你的函数应该返回一个“native”类型(string,int,list,dict等等),那么返回“”,0,[],{}等......