PEP8 E712
要求"比较True
应该if cond is True:
或if cond:
".
但如果我遵循这一点,PEP8
我会得到不同/错误的结果.为什么?
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?"
Run Code Online (Sandbox Code Playgroud)
Numpy的'True'与Python'True'的'True'不一样,因此is
失败:
>>> 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'>
Run Code Online (Sandbox Code Playgroud)
另外,具体来说,PEP 8说DONT对布尔人使用'是'或'==':
Don't compare boolean values to True or False using ==:
Yes: if greeting:
No: if greeting == True:
Worse: if greeting is True:
Run Code Online (Sandbox Code Playgroud)
一个空的numpy数组确实测试falsey就像一个空的Python列表或空dict一样:
>>> [bool(x) for x in [[],{},np.array([])]]
[False, False, False]
Run Code Online (Sandbox Code Playgroud)
与Python不同,单个falsey元素的numpy数组会测试falsey:
>>> [bool(x) for x in [[False],[0],{0:False},np.array([False]), np.array([0])]]
[True, True, True, False, False]
Run Code Online (Sandbox Code Playgroud)
但是您不能将该逻辑与具有多个元素的numpy数组一起使用:
>>> 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()
Run Code Online (Sandbox Code Playgroud)
所以PEP 8与Numpy的"精神"可能只是测试每个元素的真实性:
>>> np.where(np.array([0,0]))
(array([], dtype=int64),)
>>> np.where(np.array([0,1]))
(array([1]),)
Run Code Online (Sandbox Code Playgroud)
或使用any
:
>>> np.array([0,0]).any()
False
>>> np.array([0,1]).any()
True
Run Code Online (Sandbox Code Playgroud)
请注意,这不是您所期望的:
>>> bool(np.where(np.array([0,0])))
True
Run Code Online (Sandbox Code Playgroud)
因为np.where
返回一个非空元组.
该建议仅适用于if
测试值的“真实性”的语句。numpy
是一个不同的野兽。
>>> a = np.array([True, False])
>>> a == True
array([ True, False], dtype=bool)
>>> a is True
False
Run Code Online (Sandbox Code Playgroud)
请注意,a is True
始终是False
因为a
是一个数组,而不是布尔值,并且is
执行简单的引用相等测试(因此仅True is True
;None is not True
例如)。
归档时间: |
|
查看次数: |
2448 次 |
最近记录: |