Skip to content
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

Disallow no-args generic aliases when using PEP 613 explicit aliases #18173

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

brianschubert
Copy link
Collaborator

@brianschubert brianschubert commented Nov 19, 2024

Per the type system conformance tests, this is ok:

ListAlias = list
x = ListAlias[int]()  # OK

While this is not:

ListAlias: TypeAlias = list
x: ListAlias[int]  # E: already specialized

Mypy currently permits both. This PR makes mypy reject the latter case, improving conformance.

As part of this, no-args PEP 613 explicit aliases are no longer eagerly expanded.

(Also removed a stale comment referencing TypeAliasExpr.no_args, which was removed in #15924)

@brianschubert
Copy link
Collaborator Author

Conformance results diff for this PR (aliases_explicit now passes):

diff --git a/conformance/results/mypy/aliases_explicit.toml b/conformance/results/mypy/aliases_explicit.toml
index ee05762..f07e7ad 100644
--- a/conformance/results/mypy/aliases_explicit.toml
+++ b/conformance/results/mypy/aliases_explicit.toml
@@ -24,11 +24,11 @@ aliases_explicit.py:89: error: Invalid type: try using Literal[1] instead?  [val
 aliases_explicit.py:90: error: Invalid type alias: expression is not a valid type  [valid-type]
 aliases_explicit.py:90: error: Function "list" could always be true in boolean context  [truthy-function]
 aliases_explicit.py:91: error: Invalid type alias: expression is not a valid type  [valid-type]
+aliases_explicit.py:100: error: Bad number of arguments for type alias, expected 0, given 1  [type-arg]
 aliases_explicit.py:101: error: "UnionType[list[Any], set[Any]]" not callable  [operator]
 aliases_explicit.py:102: error: Bad number of arguments for type alias, expected 0, given 1  [type-arg]
 """
-conformance_automated = "Fail"
+conformance_automated = "Pass"
 errors_diff = """
-Line 100: Expected 1 errors
 """
 ignore_errors = ["Function \"list\" could always be true in boolean context"]
diff --git a/conformance/results/mypy/version.toml b/conformance/results/mypy/version.toml
index 699a899..1d9b711 100644
--- a/conformance/results/mypy/version.toml
+++ b/conformance/results/mypy/version.toml
@@ -1,2 +1,2 @@
-version = "mypy 1.14.0+dev.21587f01045246a9ecb54a054a5ba03e20cbbd19"
-test_duration = 4.5
+version = "mypy 1.14.0+dev.6563c362fd5ee8e1fbf17775eab5dcad5a0a7459"
+test_duration = 5.1

This comment has been minimized.

This is expected, now that the below branch is no longer taken for
PEP 613 aliases. Implicit aliases are now the only case with eager
expansion.

https://github.com/python/mypy/blob/21587f01045246a9ecb54a054a5ba03e20cbbd19/mypy/typeanal.py#L2147-L2151

This comment has been minimized.

@brianschubert
Copy link
Collaborator Author

The psycopg hits are true positives from aliases of the form _GQueue: TypeAlias = queue.Queue inside if TYPE_CHECKING blocks. Pyright already rejects these. It should be simple for them to migrate these to explicit generic aliases a la _GQueue: TypeAlias = queue.Queue[T].

from typing_extensions import TypeAlias

Implicit = List
Explicit: TypeAlias = List
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also test with non-alias generic class (e.g. <alias> = list)? You could also test with tuple, since it's a bit special.

Copy link
Contributor

Diff from mypy_primer, showing the effect of this PR on open source code:

psycopg (https://github.com/psycopg/psycopg)
+ psycopg/psycopg/_acompat.py:43: error: Bad number of arguments for type alias, expected 0, given 1  [type-arg]
+ psycopg/psycopg/_acompat.py:52: error: Returning Any from function declared to return "T"  [no-any-return]
+ psycopg/psycopg/_acompat.py:55: error: Bad number of arguments for type alias, expected 0, given 1  [type-arg]
+ psycopg_pool/psycopg_pool/_acompat.py:63: error: Bad number of arguments for type alias, expected 0, given 1  [type-arg]
+ psycopg_pool/psycopg_pool/_acompat.py:72: error: Returning Any from function declared to return "T"  [no-any-return]
+ psycopg_pool/psycopg_pool/_acompat.py:105: error: Bad number of arguments for type alias, expected 0, given 1  [type-arg]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants