PyLint:尝试解包非序列对象

7

我是PyLint的新手,很高兴看到我的源代码上有很多警告。虽然大部分警告都很明显,但有些警告对我来说没有意义。例如,

def foo(a, b):
    if b is not None:
        return a, b
    else:
        return None

result = foo(a, b)
if result is None:
    return get_something(a)

value1, value2 = result

foo(a, b) 的返回值可以是元组或空值(None)。在从 foo 获取返回值后,我会检查它是否为有效的结果。这与在 C/C++ 中检查 NULL 指针有些相似。然而,PyLint 对此类代码进行了抱怨;尝试解包非序列 [W:unpacking-non-sequence]。除了压制此警告之外,还可以避免此类警告吗?

2个回答

4
这是一种无法回答的方式,但这是我编写此代码片段的方式。首先,代码必须是可预测的,因此我发现始终返回相同数量的返回值是可预测的。这也使文档更容易理解,并且后续代码会稍微变短一些。
def foo(a, b):
    if b is not None:
        return a, b
    return None, None

value1, value2 = foo(a, b)
if value1 is None:   # Alt: value1 is None or value2 is None
    return get_something(a)

0
警告来自于 value1, value2 = result,如果您的函数返回 None,则会出错。您可以只返回 a,b 并检查 b 是否为 None:
def foo(a, b):
    return a, b

value1, value2 = foo(a, b)
if value2 is  None:
    return get_something(a)
# else use value1 and value2

你的函数返回 None 的唯一方式是如果 b 是 None,所以 else 似乎是多余的。我还假设 return get_something(a) 的逻辑在一个函数中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接