This new release greatly improves the type checking capabilities of Refurb. You might find that you are getting a lot more errors in your projects, as well as a few false positives. Please report any incorrect changes you might find!
Add better type deduction
Refurb now makes better use of Mypy's type deduction system, allowing Refurb to find more errors and with better accuracy.
For example, the following is not detected in older versions of Refurb:
python
nums = [[]]
if len(nums[0]):
print("nums[0] is not empty")
With this new version of Refurb, the type of `nums[0]` is inferred as a `list`:
$ refurb file.py
file.py:3:4 [FURB115]: Replace `len(nums[0])` with `nums[0]`
While this new type deduction is a great improvement on what existed before, there is still a lot of room for improvement. If you find any typing related bugs, please report it!
Add `use-isinstance-bool` check (FURB191)
Don't check if a value is `True` or `False` using `in`, use an `isinstance()` call.
Bad:
python
if value in {True, False}:
pass
Good:
python
if isinstance(value, bool):
pass
Add `use-str-method` check (FURB190)
Don't use a lambda function to call a no-arg method on a string, use the name of the string method directly. It is faster, and often times improves readability.
Bad:
python
def normalize_phone_number(phone_number: str) -> int:
digits = filter(lambda x: x.isdigit(), phone_number)
return int("".join(digits))
Good:
python
def normalize_phone_number(phone_number: str) -> int:
digits = filter(str.isdigit, phone_number)
return int("".join(digits))
Add `no-subclass-builtin` check (FURB189)
> Note: this check is disabled by default, see below.
Subclassing `dict`, `list`, or `str` objects can be error prone, use the `UserDict`, `UserList`, and `UserStr` objects from the `collections` module instead.
Bad:
python
class CaseInsensitiveDict(dict):
...
Good:
python
from collections import UserDict
class CaseInsensitiveDict(UserDict):
...
Note: `isinstance()` checks for `dict`, `list`, and `str` types will fail when using the corresponding User class. If you need to pass custom `dict` or `list` objects to code you don't control, ignore this check. If you do control the code, consider using the following type checks instead:
* `dict` -> `collections.abc.MutableMapping`
* `list` -> `collections.abc.MutableSequence`
* `str` -> No such conversion exists
Rename `no-del` to `use-clear` (FURB131)
Read dbe31262aa873690724b6c01db704228fe48f9e2 for more info. In short, FURB131 will now detect both of the following snippets:
python
nums = [[1, 2, 3], [4, 5, 6]]
nums[0][:] = []
del nums[0][:]
Running Refurb:
$ refurb file.py
file.py:3:1 [FURB131]: Replace `nums[0][:] = []` with `nums[0].clear()`
file.py:4:1 [FURB131]: Replace `del nums[0][:]` with `nums[0].clear()`
What's Changed
* Add `no-subclass-builtin` check by dosisod in https://github.com/dosisod/refurb/pull/324
* Add better detection and error messages for len compatible types in FURB115 by dosisod in https://github.com/dosisod/refurb/pull/331
**Full Changelog**: https://github.com/dosisod/refurb/compare/v1.28.0...v2.0.0