PTC-W0041: Not using the min built-in
Fixes this code:
if value >= 10:
value = 10
to this:
value = min(value, 10)
PTC-W0042: Not using the max built-in:
Fixes this code:
if value <= 10:
value = 10
to this:
value = max(value, 10)
PYL-W0711: Exception to catch is the result of a binary operation
Fixes this code:
try:
something()
except Exc1 or Exc2:
print("caught!")
to this:
try:
something()
except (Exc1, Exc2):
print("caught!")
PYL-R1701: Consider merging isinstance calls
Changes this:
if isinstance(i, int) or isinstance(i, float):
print('A number')
to this:
if isinstance(i, (int, float)):
print('A number')
FLK-W601: Use of deprecated has_key
Changes this:
if my_dict.has_key("my key"):
# do something
...
to this:
if "my key" in my_dict:
# do something
...
FLK-E401: Multiple imports on a line
Changes this:
import os, sys
to this:
import os
import sys
PYL-E0211: Method has no argument
This issue complaints of method which should have the bound instance as the first argument has no argument defined.
The fixer will detect if it is a classmethod or a regular method and add the required argument.
So, this:
class Cls:
def some_method():
...
@classmethod
def something():
...
Will be changed to:
class Cls:
def some_method(self):
...
@classmethod
def something(cls):
...
PTC-W0039: Unnecessary None provided as default
It is unnecessary to provide None as the default value when the key is not present in the dictionary as get implicitly returns None.
So, the fixer will change this:
value = some_dict.get("key", None)
to this:
value = some_dict.get("key")
PYL-C0414: Import alias same as the original package name
Import alias is the same as the original package name, thus making the alias unnecessary.
So, this:
import my_package as my_package
Will be automatically fixed to:
import my_package
PYL-W0107: Unnecessary pass statement
Changes this:
class Docstring:
'''This is a dummy class with docstring.'''
pass
to this:
class Docstring:
'''This is a dummy class with docstring.'''
PYL-R1707: Trailing comma tuple
Changes this:
fruits = apple,
to this:
fruits = (apple,)
PYL-R1703: if statement can be simplified
Changes this:
def simplifiable_if(arg, arg2):
if arg and not arg2:
var = True
else:
var = False
return var
to this:
def simplifiable_if(arg, arg2):
var = bool(arg and not arg2)
return var
PYL-R1719: if expression can be simplified
value = True if arg else False
will be simplified into:
value = bool(arg)
PYL-R1706: consider using if expression
This fixer will replace the use of pre-Python 2.5 ternary syntax with an if expression.
So, the following code:
def get_val(condition, fallback, on_truth=None):
if on_truth is None:
on_truth = []
return condition and on_truth or fallback
will be refactored as:
def get_val(condition, fallback, on_truth=None):
if on_truth is None:
on_truth = []
return on_truth if condition else fallback
PYL-R1712: Use tuple unpacking to swap variables
The following code:
temp = a
a = b
b = temp
will be refactored as:
a, b = b, a
PYL-E0113: Invalid star assignment target
Changes this:
*var = [1, 2, 3, 4]
to this:
(*var, ) = [1, 2, 3, 4]
PYL-R0205: Useless inheritance from object
Changes this:
class Foo(object):
"""Foo bar baz"""
to this:
class Foo:
"""Foo bar baz"""
PYL-W0235: Useless super delegation
Any method in a child class which is only calling the overridden method of any of its base class using super and doing nothing else is unnecessary.
So, this:
class Egg:
def __init__(self, first, second):
pass
class Spam(Egg):
def __init__(self, first, second):
super().__init__(first, second)
will be refactored as:
class Egg:
def __init__(self, first, second):
pass
class Spam(Egg):
...
PYL-R1705: Unnecessary else / elif used after return
Changes this:
def classify_number(x):
if x % 2 == 0:
return 'Even'
else:
return 'Odd'
def what_is_this_number(x):
if x % 2 == 0 and x >= 0:
return 'Even'
elif x % 2 == 0 and x < 0:
return 'Even and Negative'
elif x % 2 != 0 and x < 0:
return 'Odd and Negative.'
else:
return 'Odd'
to this:
def classify_number(x):
if x % 2 == 0:
return 'Even'
return 'Odd'
def what_is_this_number(x):
if x % 2 == 0 and x >= 0:
return 'Even'
if x % 2 == 0 and x < 0:
return 'Even and Negative'
if x % 2 != 0 and x < 0:
return 'Odd and Negative'
return 'Odd'
PYL-R1724: Unnecessary elif / else block after continue
Refactors this:
def classify_number(x):
for num in range(x):
if x % 2 == 0:
continue
else:
print(f"{num} is Odd}")
as this:
def classify_number(x):
for num in range(x):
if x % 2 == 0:
continue
print(f"{num} is Odd}")
PYL-R1723: Unnecessary else / elif used after break
Refactors this:
def changing_denominators(p, q):
while True:
if q == 0:
break
else:
print(p/q)
q = q - 1
To this:
def changing_denominators(p, q):
while True:
if q == 0:
break
print(p/q)
q = q - 1
PYL-R1720: Unnecessary else/elif used after raise
Refactors this:
def check_magic_generator(attribute):
magic = get_magic_number(attribute)
if magic < 0:
raise ValueError(f"{attribute} looks invalid")
elif magic > 100
raise ValueError(f"{attribute} is very magical")
else:
return magic
To this:
def check_magic_generator(attribute):
magic = get_magic_number(attribute)
if magic < 0:
raise ValueError(f"{attribute} looks invalid")
if magic > 100
raise ValueError(f"{attribute} is very magical")
return magic
PYL-W0126: Missing parentheses for call in the test
Changes this:
def bool_function():
return True
def nonbool_function():
return 42
if bool_function:
pass
if nonbool_function:
pass
To this:
def bool_function():
return True
def nonbool_function():
return 42
if bool_function():
pass
if nonbool_function():
pass
PYL-W0705: Catching previously caught exception
Changes this:
try:
1 / 0
except ZeroDivisionError:
print("Divided by zero")
except (OSError, ZeroDivisionError):
print("Handles an exception which was caught before.")
To this:
try:
1 / 0
except ZeroDivisionError:
print("Divided by zero")
except OSError:
print("Handles a unique exception")
PYL-E0237: Assigning to an attribute not defined in class slots
During autofix, DeepSource will add the missing names in slots
So, this:
class E:
__slots__ = "foo"
def __init__(self):
self.not_foo = "Not foo"
self.not_bar = "Not Bar"
Will be changed to:
class E:
__slots__ = ["foo", "not_foo", "not_bar"]
def __init__(self):
self.not_foo = "Not foo"
self.not_bar = "Not Bar"
PYL-W1403: Implicit string concatenation
The autofix will add the missing comma in the sequence.
So, this:
sample_seq = ['A', 'B' 'C', 'D']
will be changed to:
sample_seq = ['A', 'B', 'C', 'D']
PYL-W0108: Unnecessary lambda expression
During autofix, the lambda function is removed and the callable is assigned directly to the variable to avoid any breakage.
PYL-E0238: Invalid __slots__ object
During autofix, DeepSource will replace the invalid object with []
So, this:
class Bad:
__slots__ = list
will be changed to:
class Bad:
__slots__ = []
PYL-W0404: Multiple imports for an import name
import os
from os import path
from sys import path
import os
will be refactored as:
import os
from os import path
PYL-W1507: Shallow copy of os.environ
os.environ is not a dict but proxy object.
The use of copy.copy(os.environ) will make a shallow copy of os.environ therefore, any changes made in the copy would be reflected in os.environ as well.
During the autofix, DeepSource will replace copy.copy(os.environ) with os.environ.copy() calls.
PYL-E0241: Class has duplicate bases
DeepSource will remove the duplicate bases during the autofix.
i.e.,
class SomeClass(SomeBase, Unique, SomeBase):
...
will be refactored to:
class SomeClass(SomeBase, Unique):
...