As I mentioned previously, I'm now using Ruff to lint my Python projects. Several linter warnings continually crop up in my code, which I find interesting, so I thought I'd highlight a few of them (there are plenty that I'm leaving out; I apparently write fairly crude code by these linters' standards).
missing-trailing-comma
This is a common recurrence in places where I'm setting up a dict
for something:
mydict = {
'posts': some_queryset.all(),
'today': Date.today() # Missing a trailing comma
}
if-expr-with-false-true
This pops up on occasion for me, though not terribly often. I apparently easily forget about the not
operator.
return False if self.errors else True
# The above is a little more legible if we use:
return not self.errors
superfluous-else-return
I was surprised that this occurred so often in my code. Removing these cases flattens the code somewhat, which is a new practice I'm trying to engrain into my programming habits.
if (is_ajax_request(request)):
return HttpResponseForbidden('Forbidden')
else: # This isn't needed
return redirect(reverse('home'))
# The above looks better as:
if (is_ajax_request(request)):
return HttpResponseForbidden('Forbidden')
return redirect(reverse('home'))
explicit-f-string-type-conversion
This warning taught me something I didn't know about f-strings; namely that explicit conversion flags are available. Also that the conversions I was making were mostly not necessary in the first place.
error = f"Part not owned by {str(self.part_owner)}!"
# Better:
error = f"Part not owned by {self.part_owner!s}!."
# Best:
error = f"Part not owned by {self.part_owner}!."
type-comparison
Again, I was surprised by how often I do this. Base types can (and often are) subclassed, so it's better to use isinstance()
than type is
.
if (type(loader) is list):
return error_response(loader)
# Better:
if (isinstance(loader, list)):
return error_response(loader)
Running the linting frameworks has taught me a fair amount about my programming habits, and has also informed me about various aspects of the language. I recommend running linters if you don't already, and I highly recommend Ruff!