【问题标题】:Is it bad Python style to return empty iterators rather than None? [closed]返回空迭代器而不是 None 是不好的 Python 风格吗? [关闭]
【发布时间】:2013-01-16 08:42:36
【问题描述】:

对此似乎意见不一——是否有 Python 式的“正确方法”来做到这一点?

【问题讨论】:

  • “正确的方式”在什么情况下?
  • 一个例子是从 REST 查询返回结果。

标签: python iterator generator


【解决方案1】:

我认为空迭代器更好,因为迭代没有比先检查返回值是否为 None 更快,然后再迭代。

for x in function():
    do_something()

value = function()
if value is not None:
    for x in value:
        do_something()

看看这个。

通常你也不用 None 初始化 iter 属性,而是用空的 iter 对象。

self.list_of_users = []

不是

self.list_of_users = None

【讨论】:

  • “无内容迭代更快” [citation-needed]。是的,它更简洁,,但没有一些timeit 结果,我不相信它更快。
  • 您可以这样写:for item in some_func() or []: pass[do_something(item) for item in some_func() or []]
  • 还要考虑当函数没有返回结果时你需要做一些不同的事情的情况,你必须首先检查迭代器的大小。
  • @espeed:好吧,我没有说你不能返回 None。我只是说你通常应该返回空的 iter 只是为了方便界面,在我看来它更像是 pythonic 然后返回 None 。万一出现问题,不应该返回任何东西。在示例中,当我在 tcp 服务器parse_data(buffer) 中的方法由于某种原因无法解析时,我返回 None。我不能引发异常,因为它是异步服务器,而且我必须知道发送的数据是恶意的,所以我返回 None。
  • @MattBall:速度将取决于返回的数据类型。我只是假设大多数时候会返回 iter 对象,然后额外的 if 肯定会更慢。但是如果大部分时间 None 将被返回,那么检查 is None 可能比在空迭代器上初始化迭代器更快。无论如何,我们都必须进行一些测试。
【解决方案2】:

如果可以的话,我被教导要遵循的一般做法是为输入域中的所有有效值返回相同的数据类型。它使其他人更容易使用您的代码,并且您的文档将更清晰。对于有效输入域之外的值,引发异常。

在这种情况下,一个空的迭代器,而不是 None,似乎是一个更好的做法。我知道其他编程语言喜欢在这些情况下返回 null ,但我认为在您描述的场景中这样做没有好处。

【讨论】:

  • 我参加“不要返回空的迭代器”阵营的原因之一是,如果您需要为空的情况做点什么,您必须通过以下方式检查迭代器的大小if len(results): 如果迭代器很大,这可能会很昂贵,而 if results is None: 很便宜,因此更灵活。
  • 如果 x 是一个迭代器,如果 x 为空,"if x" 将返回 False
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 2012-06-16
  • 2015-07-03
  • 2018-06-25
  • 1970-01-01
  • 2023-03-20
  • 2017-03-12
  • 1970-01-01
相关资源
最近更新 更多