Python Analyzer Updates -- January 2021

New Issues:

10 new issues have been added to the Python analyzer. Here are the issues with examples:

Bad async magic method (PTC-W0045):

class BadClass: async def __lt__(self, other): 

Unit test class with no tests (PTC-W0046):

import unittest def Tests(unittest.TestCase): def my_test(self, arg1, arg2): self.assertEquals(arg1, arg2) 

Empty block of code (PTC-W0047):

for _ in range(10): pass 

if statements can be merged (PTC-W0048):

if condition1: if condition2: dosomething() 

Function/method with an empty body (PTC-W0049):

def my_func(foo="Noncompliant"): pass class MyClass: def mymethod1(self, foo="Noncompliant"): pass 

Duplicate elements during set declaration (PTC-W0050):

my_set = {"one", "two", "one"} def myfunc(a, b, c): my_set = {a, b, a, c} 

Abstract method does not raise NotImplementedError (PTC-W0053):

import abc class Vehicle: __metaclass__ = abc.ABCMeta @abc.abstractmethod def method_to_implement(self, input): return 

Special method should return NotImplemented (PTC-W0054):

class A: def __init__(self, val): self.val = val def __add__(self, other): raise NotImplementedError class B: def __init__(self, val): self.val = val def __add__(self, other): return self.val + other.val def __radd__(self, other): return self.val + other.val A(1) + B(1) # This will raise `NotImplementedError` 

Audit Issue: Unverified server certificate (PTC-W6001):

import ssl context = ssl.create_default_context() ctx3.verify_mode = ssl.CERT_NONE # Setting this won't verify the certificate 

Audit Issue: Unverified server hostname (PTC-W6002):

import ssl context = ssl._create_stdlib_context() # by default hostname verification is not done 

Autofix Additions:

The Python analyzer can now automatically fix 6 more issues.

PTC-W0043:

This fixer removes the unnecessary del statement from the local scope.

PTC-W0044:

This changes the use of len(seq) - 1 to get the last element.
So, an occurrence like seq[len(seq)-1] would be changed to seq[-1].

PTC-W0045:

This fixer converts the async magic method into a regular method.

PTC-W0050:

This fixer removes duplicate elements during a set declaration

PTC-W9006:

Provide blank=True for a field with null=True to Django fields that allow null but not blank.

PTC-W9007:

Remove redundant default=None from Django fields.

1 Like

Adding to a false-positive report about PTC-W0053, that I just made: It’s a false positive only when the class inherits from abc.ABC, i.e.:

import abc class Vehicle(abc.ABC): @abc.abstractmethod def method_to_implement(self, input): ... 

In that case Vehicle can’t be initialized, so there is no need to raise NotImplementedError :slight_smile:

Sounds about right.
Looks like we missed this here.

Allow us some time to look into this. We will drop an update here!

1 Like

Update: This case is now handled. Kudos to you for bringing this to our notice. :raised_hands:

1 Like