2013-03-01 1 views
6

PEP8 E712 exige que "la comparaison à True devrait être if cond is True: ou if cond:". Mais si je suis ce PEP8 je reçois des résultats différents/erronés. Pourquoi?Comparaison avec des tableaux booléens chiffrés VS PEP8 E712

In [1]: from pylab import * 

In [2]: a = array([True, True, False]) 

In [3]: where(a == True) 
Out[3]: (array([0, 1]),) 
# correct results with PEP violation 

In [4]: where(a is True) 
Out[4]: (array([], dtype=int64),) 
# wrong results without PEP violation 

In [5]: where(a) 
Out[5]: (array([0, 1]),) 
# correct results without PEP violation, but not as clear as the first two imho. "Where what?" 
+0

Où trouvez-vous ce PEP8 E712? – mgilson

+2

Ceci est une sortie de diagnostic spécifique par l'outil 'pep8': https://github.com/jcrocholl/pep8/blob/master/pep8.py#L900. Notez que c'est faux dans ce cas parce que 'a est vrai 'n'est pas une chose significative à faire avec un tableau. – nneonneo

+0

@mgilson Vous pouvez également rechercher python 'linter'. La plupart des IDEs ont des plugins pour effectuer une vérification pep8 de votre code. – Framester

Répondre

2

Ce conseil s'applique uniquement aux instructions if testant la "véracité" d'une valeur. numpy est une bête différente.

>>> a = np.array([True, False]) 
>>> a == True 
array([ True, False], dtype=bool) 
>>> a is True 
False 

Notez que a is True est toujours False parce a est un tableau, pas un booléen, et is-t un simple test d'égalité de référence (si seulement True is True, None is not True par exemple).

6

Numpy de 'vrai' est pas le même 'vrai' comme 'vrai' et celui-ci is échoue de Python:

>>> import numpy as np 
>>> a = np.array([True, True, False]) 
>>> a[:] 
array([ True, True, False], dtype=bool) 
>>> a[0] 
True 
>>> a[0]==True 
True 
>>> a[0] is True 
False 
>>> type(a[0]) 
<type 'numpy.bool_'> 
>>> type(True) 
<type 'bool'> 

En outre, en particulier, PEP 8 dit DONT utilisation est 'ou '==' pour booléens:

Don't compare boolean values to True or False using ==: 

Yes: if greeting: 
No: if greeting == True: 
Worse: if greeting is True: 

un tableau de numpy vide ne Falsey test comme une liste Python vide ou dict vide fait:

>>> [bool(x) for x in [[],{},np.array([])]] 
[False, False, False] 

Contrairement à Python, un tableau numpy d'un seul élément Falsey-t Falsey test:

>>> [bool(x) for x in [[False],[0],{0:False},np.array([False]), np.array([0])]] 
[True, True, True, False, False] 

Mais vous ne pouvez pas utiliser cette logique avec un tableau numpy avec plus d'un élément:

>>> bool(np.array([0,0])) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Ainsi, le ' esprit » du PEP 8 avec Numpy est probablement uniquement pour tester la truthiness de chaque élément:

>>> np.where(np.array([0,0])) 
(array([], dtype=int64),) 
>>> np.where(np.array([0,1])) 
(array([1]),) 

Ou utilisez any:

>>> np.array([0,0]).any() 
False 
>>> np.array([0,1]).any() 
True 

Et sachez que ce n'est pas ce que vous attendez:

>>> bool(np.where(np.array([0,0]))) 
True 

Depuis np.where renvoie un tuple non vide.

Questions connexes