小编Jru*_*ruv的帖子

flake8抱怨过滤子句中的布尔比较"=="

我在mysql db表中有一个布尔字段.

# table model
class TestCase(Base):
    __tablename__ = 'test_cases'
    ...
    obsoleted = Column('obsoleted',  Boolean)
Run Code Online (Sandbox Code Playgroud)

要获得所有未经过时的测试用例的计数,可以像这样完成:

caseNum = session.query(TestCase).filter(TestCase.obsoleted == False).count()
print(caseNum)
Run Code Online (Sandbox Code Playgroud)

这很好,但是flake8报告了以下警告:

E712:与False的比较应该是"如果cond是假的:"或"如果不是cond:"

好的,我觉得这很有道理.所以将我的代码更改为:

caseNum = session.query(TestCase).filter(TestCase.obsoleted is False).count()
Run Code Online (Sandbox Code Playgroud)

要么

caseNum = session.query(TestCase).filter(not TestCase.obsoleted).count()
Run Code Online (Sandbox Code Playgroud)

但他们都不能奏效.结果始终为0.我认为filter子句不支持运算符"is"或"is not".有人可以告诉我如何处理这种情况.我不想禁用片状.

python mysql sqlalchemy flake8

46
推荐指数
3
解决办法
1万
查看次数

为什么列表切片上的循环比 range() 更快?

请看下面的代码:

from timeit import timeit
import random 


for size in (10 ** 3, 10 ** 4, 10 ** 5, 10 ** 6):
    print('---')
    nums = [random.randint(1, 10000000) for i in range(size)]
    l = len(nums)    
    sp = l // 2

    def with_slice(): 
        for n in nums[sp:]:
            pass

    def pure_loop(): 
        for i in range(sp, l):
            pass        
        
    def no_slice(): 
        for i in range(sp, l):
            n = nums[i]
            
        
    for method in (with_slice, pure_loop, no_slice):
        print(f'Size={size:<10} method={method.__name__:<20} time={timeit(method, number=300)} ms')
Run Code Online (Sandbox Code Playgroud)

测试结果:

---
Size=1000       method=with_slice           time=0.003086836077272892 …
Run Code Online (Sandbox Code Playgroud)

performance python-3.x

3
推荐指数
1
解决办法
968
查看次数

标签 统计

flake8 ×1

mysql ×1

performance ×1

python ×1

python-3.x ×1

sqlalchemy ×1