【发布时间】:2013-01-16 08:42:36
【问题描述】:
对此似乎意见不一——是否有 Python 式的“正确方法”来做到这一点?
【问题讨论】:
-
“正确的方式”在什么情况下?
-
一个例子是从 REST 查询返回结果。
对此似乎意见不一——是否有 Python 式的“正确方法”来做到这一点?
【问题讨论】:
我认为空迭代器更好,因为迭代没有比先检查返回值是否为 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 []]。
parse_data(buffer) 中的方法由于某种原因无法解析时,我返回 None。我不能引发异常,因为它是异步服务器,而且我必须知道发送的数据是恶意的,所以我返回 None。
if 肯定会更慢。但是如果大部分时间 None 将被返回,那么检查 is None 可能比在空迭代器上初始化迭代器更快。无论如何,我们都必须进行一些测试。
如果可以的话,我被教导要遵循的一般做法是为输入域中的所有有效值返回相同的数据类型。它使其他人更容易使用您的代码,并且您的文档将更清晰。对于有效输入域之外的值,引发异常。
在这种情况下,一个空的迭代器,而不是 None,似乎是一个更好的做法。我知道其他编程语言喜欢在这些情况下返回 null ,但我认为在您描述的场景中这样做没有好处。
【讨论】:
if len(results): 如果迭代器很大,这可能会很昂贵,而 if results is None: 很便宜,因此更灵活。