-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FA100
and FA102
do not trigger with function annotations
#5574
Labels
bug
Something isn't working
Comments
Thanks for the clear issue. I need to look back to refresh myself on this. |
Yeah this is a bug. Thanks! I'll make sure it's fixed for the next release. |
Awesome, thanks for such a quick response! |
charliermarsh
added a commit
that referenced
this issue
Jul 7, 2023
## Summary In Python, the annotations on `x` and `y` here have very different treatment: ```python def foo(x: int): y: int ``` The `int` in `x: int` is a runtime-required annotation, because `x` gets added to the function's `__annotations__`. You'll notice, for example, that this fails: ```python from typing import TYPE_CHECKING if TYPE_CHECKING: from foo import Bar def f(x: Bar): ... ``` Because `Bar` is required to be available at runtime, not just at typing time. Meanwhile, this succeeds: ```python from typing import TYPE_CHECKING if TYPE_CHECKING: from foo import Bar def f(): x: Bar = 1 f() ``` (Both cases are fine if you use `from __future__ import annotations`.) Historically, we've tracked those annotations that are _not_ runtime-required via the semantic model's `ANNOTATION` flag. But annotations that _are_ runtime-required have been treated as "type definitions" that aren't annotations. This causes problems for the flake8-future-annotations rules, which try to detect whether adding `from __future__ import annotations` would _allow_ you to rewrite a type annotation. We need to know whether we're in _any_ type annotation, runtime-required or not, since adding `from __future__ import annotations` will convert any runtime-required annotation to a typing-only annotation. This PR adds separate state to track these runtime-required annotations. The changes in the test fixtures are correct -- these were false negatives before. Closes #5574.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm migrating a project to
ruff
(huge fan so far, thanks maintainers!), and getting inconsistent behavior from theflake8-future-annotations
rules, FA100 and FA102. They trigger as expected for variable type annotations but do not trigger for function parameter or return type annotations.Reproducing
pyproject.toml
config.main.py
using the example code from theruff
docs.And the commands I'm running:
No rules triggered.
Exceptions
Both rules will trigger with variable type annotations. For example:
main.py
This seems to be inconsistent with
flake8-future-annotations
, the example code in theruff
docs, and I believe the intended behavior. Let me know if you need any more details, thanks!The text was updated successfully, but these errors were encountered: