2015-09-10 27 views
5

Jestem nowy w PyLint i cieszę się, że widzę wiele ostrzeżeń na moim kodzie źródłowym. Chociaż większość ostrzeżeń jest oczywista, niektóre ostrzeżenia nie dotyczą mnie. Na przykład,PyLint: Próba rozpakowania niesekwencyjnego

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) jest wartość powrotna może być krotki lub brak. Po uzyskaniu wartości zwracanej z foo, sprawdzam, czy jest to prawidłowy wynik, czy nie. (Jest nieco podobny do sprawdzania wskaźnika NULL w C/C++). Jednak skargi PyLint dotyczące takiego kodu; Attempting to unpack a non-sequence [W:unpacking-non-sequence] Można uniknąć takich ostrzeżeń, z wyjątkiem tłumienia tego ostrzeżenia?

Odpowiedz

4

To nie jest żadna odpowiedź, ale tak napisałbym ten fragment kodu. Przede wszystkim, kod musi być przewidywalny i zawsze zwracam tę samą liczbę przewidywalnych wartości zwracanych. To także ułatwia dokumentację, a poniższy kod trochę się skraca.

def foo(a, b): 
    if b is not None: 
     return a, b 
    else: 
     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

Ostrzeżenie jest następujące: value1, value2 = result, co oznacza błąd, jeśli funkcja zwróciła Brak. można po prostu wrócić A, B i sprawdzić, czy b jest 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 

Jedynym sposobem twoja funkcja zwróci None jest, jeśli b jest Brak więc jeszcze wydaje się zbędny. Zakładam też, że logika return get_something(a) jest w funkcji.