2013-03-01 36 views
6

PEP8 E712 yêu cầu "so sánh với True phải là if cond is True: hoặc if cond:".So sánh với mảng numpy boolean VS PEP8 E712

Nhưng nếu tôi làm theo điều này PEP8 Tôi nhận được kết quả khác nhau/sai. Tại sao?

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

Bạn đang tìm đâu PEP8 E712 này? – mgilson

+2

Đây là đầu ra chẩn đoán cụ thể bằng công cụ 'pep8': https://github.com/jcrocholl/pep8/blob/master/pep8.py#L900. Lưu ý rằng nó là sai trong trường hợp này bởi vì 'a là True' không phải là một điều có ý nghĩa để làm với một mảng. – nneonneo

+0

@mgilson Bạn cũng có thể tìm kiếm trăn 'linter'. Hầu hết/một số IDE có plugin để kiểm tra pep8 mã của bạn. – Framester

Trả lời

2

Lời khuyên đó chỉ áp dụng cho if câu lệnh kiểm tra tính "trung thực" của một giá trị. numpy là một con thú khác.

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

Lưu ý rằng a is True luôn là Falsea là một mảng, không phải là một boolean, và is hiện một bài kiểm tra bình đẳng tham khảo đơn giản (vì vậy chỉ True is True; None is not True ví dụ).

6

NumPy của 'True' không giống 'True' như Python của 'True' và do is thất bại:

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

Ngoài ra, cụ thể, PEP 8 nói DONT sử dụng 'được' hoặc '==' cho boolean:

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

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

một mảng numPy trống không kiểm tra falsey cũng giống như một danh sách Python rỗng hoặc dict trống không:

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

Không giống như Python, một mảng NumPy của một yếu tố falsey duy nhất hiện kiểm tra falsey:

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

Nhưng bạn không thể sử dụng logic rằng với một mảng NumPy với nhiều hơn một phần tử:

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

Vì vậy, các ' tinh thần' của PEP 8 với numPy có lẽ là để chỉ kiểm tra truthiness mỗi phần tử:

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

Hoặc sử dụng any:

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

Và lưu ý rằng đây không phải là những gì bạn mong đợi:

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

Kể từ np.where đang trở lại một tuple rỗng.