2013-03-01 12 views
6

PEP8 E712 "True ile karşılaştırmanın if cond is True: veya if cond: olması gerekir".Boole numpy dizileri ile karşılaştırma VS PEP8 E712

Ancak bu PEP8'u takip edersem farklı/yanlış sonuçlar elde ederim. Niye ya?

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

Bu PEP8 E712'yi nereden buluyorsunuz? – mgilson

+2

Bu "pep8" aracı tarafından özel bir teşhis çıktı: https://github.com/jcrocholl/pep8/blob/master/pep8.py#L900. Bu durumda yanlış olduğunu unutmayın, çünkü 'a True' bir dizi ile ilgili anlamlı bir şey değildir. – nneonneo

+0

@mgilson Ayrıca python 'linter' için arama yapabilirsiniz. Çoğu/bazı IDE'lerin kodunuzun pep8 kontrolünü yapmak için eklentileri vardır. – Framester

cevap

2

Bu tavsiye yalnızca değerin "doğruluğuna" için if ifadeleri test için geçerlidir. numpy farklı bir yaratıktır. a bir dizi, bir mantıksal ve is basit bir referans eşitlik testi yapar False için a is True her zaman olduğu

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

Not (yani sadece True is True; None is not True örneğin).

6

Numpy en 'True' değil Python en 'True' ve bunun is başarısız aynı 'True' için '=='

>>> 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'> 

Ayrıca özellikle PEP 8 DONT kullanımı 'olduğunu' diyor ya Boolean:

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

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

boş numpy dizisi sadece boş Python liste veya boş dict Test Falsey yapar yapar:

>>> [bool(x) for x in [[],{},np.array([])]] 
[False, False, False] 
Python, tek Falsey elemanın bir numpy dizisi aksine

testi Falsey yapar:

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

Ama birden fazla elemanı ile numpy dizisi ile bu mantığı kullanamazsınız: 'Yani

>>> 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() 

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

Veya kullanmak any: Numpy ile PEP 8 ruhu' sadece her öğenin truthiness test etmek muhtemelen

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

Ve bu ne bekliyoruz olmadığını unutmayın: np.where yana

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

boş olmayan bir başlığın dönüyor.

İlgili konular