dosisod / refurb

A tool for refurbishing and modernizing Python codebases
GNU General Public License v3.0
2.49k stars 54 forks source link

[Enhancement]: defaulted `next` to `except StopIteration` #342

Open jamesbraza opened 5 months ago

jamesbraza commented 5 months ago

Overview

Firstly, hope all is well! I have successfully adopted refurb>=2 and it's working great. So excellent work with the v2 major bump.


I would like to request a new rule: reporting to go from defaulted next to except StopIteration. Please see the below Proposal.

Proposal

list_of_truthy = [False, False]

# Slightly suboptimal route 1: passing default of None
first_truthy = next((t for t in list_of_truthy if t), None)
if first_truthy is None:
    raise ValueError(f"{list_of_truthy} has no truthy items.")

# More optimal route 2: try-except
try:
    first_truthy = next(t for t in list_of_truthy if t)
except StopIteration as exc:
    raise ValueError(f"{list_of_truthy} has no truthy items.") from exc
dosisod commented 1 week ago

@jamesbraza Thank you for the kind words! I'm responding to this late so v2 feels like it was ages ago, but it was a huge milestone, I'm glad to be working on this project a bit more now.

This would be a good feature to add, and AFAICT, it isn't implemented in Ruff, so this would be a good candidate.