A highly opinionated flake8 plugin for Trio-related problems.
This can include anything from outright bugs, to pointless/dead code, to likely performance issues, to minor points of idiom that might signal a misunderstanding.
It may well be too noisy for anyone with different opinions, that's OK.
Pairs well with flake8-async and flake8-bugbear.
pip install flake8-trio
List of warnings
with trio.move_on_after(...):context does not contain any
awaitstatements. This makes it pointless, as the timeout can only be triggered by a checkpoint.
yieldinside a nursery or cancel scope is only safe when implementing a context manager - otherwise, it breaks exception handling.
TRIO102: it's unsafe to await inside
except BaseException/trio.Cancelledunless you use a shielded cancel scope with a timeout.
except trio.Cancelledwith a code path that doesn't re-raise. Note that any
raisestatements in loops are ignored since it's tricky to parse loop flow with
continueand/or the zero-iteration case.
BaseExceptionmust be re-raised - when a user tries to
raisea different exception.
TRIO105: Calling a trio async function without immediately
TRIO106: trio must be imported with
import triofor the linter to work.
TRIO107: exit or
returnfrom async function with no guaranteed checkpoint or exception since function definition.
TRIO108: exit, yield or return from async iterable with no guaranteed checkpoint since possible function entry (yield or function definition)
async for, and
async with(on one of enter/exit).
TRIO109: Async function definition with a
timeoutparameter - use
while <condition>: await trio.sleep()should be replaced by a