A highly opinionated flake8 plugin for Trio-related problems.
Project description
flake8-trio
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.
Installation
pip install flake8-trio
List of warnings
- TRIO100: a
with trio.fail_after(...):
orwith trio.move_on_after(...):
context does not contain anyawait
statements. This makes it pointless, as the timeout can only be triggered by a checkpoint. - TRIO101:
yield
inside 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
finally:
orexcept BaseException/trio.Cancelled
unless you use a shielded cancel scope with a timeout. - TRIO103:
except BaseException
andexcept trio.Cancelled
with a code path that doesn't re-raise. - TRIO104:
Cancelled
andBaseException
must be re-raised - when a user tries toreturn
orraise
a different exception. - TRIO105: Calling a trio async function without immediately
await
ing it. - TRIO106: trio must be imported with
import trio
for the linter to work. - TRIO107: exit or
return
from 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)
Checkpoints are
await
,async for
, andasync with
(on one of enter/exit). - TRIO109: Async function definition with a
timeout
parameter - usetrio.[fail/move_on]_[after/at]
instead - TRIO110:
while <condition>: await trio.sleep()
should be replaced by atrio.Event
. - TRIO111: Variable, from context manager opened inside nursery, passed to
start[_soon]
might be invalidly accesed while in use, due to context manager closing before the nursery. This is usually a bug, and nurseries should generally be the inner-most context manager. - TRIO112: nursery body with only a call to
nursery.start[_soon]
and not passing itself as a parameter can be replaced with a regular function call.
Configuration
no-checkpoint-warning-decorators
: Specify a list of decorators to disable checkpointing checks for, turning off TRIO107 and TRIO108 warnings for functions decorated with any decorator matching any in the list. Matching is done with fnmatch. Defaults to disabling for asynccontextmanager
.
Decorators-to-match must be identifiers or dotted names only (not PEP-614 expressions), and will match against the name only - e.g. foo.bar
matches foo.bar
, foo.bar()
, and foo.bar(args, here)
, etc.
For example:
[flake8]
no-checkpoint-warning-decorators = mydecorator, mydecoratorpackage.checkpointing_decorators.*, ign*, *.ignore
Changelog
22.11.1
- TRIO102 is no longer skipped in (async) context managers, since it's not a missing-checkpoint warning.
22.9.2
- Fix a crash on nontrivial decorator expressions (calls, PEP-614) and document behavior.
22.9.1
- Add
--no-checkpoint-warning-decorators
option, to disable missing-checkpoint warnings for certain decorated functions.
22.8.8
- Fix false alarm on TRIO107 with checkpointing
try
and emptyfinally
- Fix false alarm on TRIO107&108 with infinite loops
22.8.7
- TRIO107+108 now ignores
asynccontextmanager
s, since both__aenter__
and__aexit__
should checkpoint.async with
is also treated as checkpointing on both enter and exit. - TRIO107 now completely ignores any function whose body consists solely of ellipsis, pass, or string constants.
- TRIO103, 107 and 108 now inspects
while
conditions andfor
iterables to avoid false alarms on a couple cases where the loop body is guaranteed to run at least once.
22.8.6
- TRIO103 now correctly handles raises in loops, i.e.
raise
in else is guaranteed to run unless there's abreak
in the body.
22.8.5
- Add TRIO111: Variable, from context manager opened inside nursery, passed to
start[_soon]
might be invalidly accesed while in use, due to context manager closing before the nursery. This is usually a bug, and nurseries should generally be the inner-most context manager. - Add TRIO112: this single-task nursery could be replaced by awaiting the function call directly.
22.8.4
- Fix TRIO108 raising errors on yields in some sync code.
- TRIO109 now skips all decorated functions to avoid false alarms
22.8.3
- TRIO108 now gives multiple error messages; one for each path lacking a guaranteed checkpoint
22.8.2
- Merged TRIO108 into TRIO107
- TRIO108 now handles checkpointing in async iterators
22.8.1
- Added TRIO109: Async definitions should not have a
timeout
parameter. Usetrio.[fail/move_on]_[at/after]
- Added TRIO110:
while <condition>: await trio.sleep()
should be replaced by atrio.Event
.
22.7.6
- Extend TRIO102 to also check inside
except BaseException
andexcept trio.Cancelled
- Extend TRIO104 to also check for
yield
- Update error messages on TRIO102 and TRIO103
22.7.5
- Add TRIO103:
except BaseException
orexcept trio.Cancelled
with a code path that doesn't re-raise - Add TRIO104: "Cancelled and BaseException must be re-raised" if user tries to return or raise a different exception.
- Added TRIO107: Async functions must have at least one checkpoint on every code path, unless an exception is raised
- Added TRIO108: Early return from async function must have at least one checkpoint on every code path before it.
22.7.4
- Added TRIO105 check for not immediately
await
ing async trio functions. - Added TRIO106 check that trio is imported in a form that the plugin can easily parse.
22.7.3
- Added TRIO102 check for unsafe checkpoints inside
finally:
blocks
22.7.2
- Avoid
TRIO100
false-alarms on cancel scopes containingasync for
orasync with
.
22.7.1
- Initial release with TRIO100 and TRIO101
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for flake8_trio-22.11.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1edf4cd68f2ec089d31abfce43b4592488cf625ddcf92252a423f63b15bb7e96 |
|
MD5 | d3d39c3c2eaf1442ce8769153f8f6ac9 |
|
BLAKE2b-256 | 3ce38656e290d1a51a7f8c00cf0e786b5edadc2c8a3ac7121cb35e42b66b5d9e |