python / mypy

Optional static typing for Python
https://www.mypy-lang.org/
Other
18.55k stars 2.84k forks source link

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

Open brianschubert opened 6 days ago

brianschubert commented 6 days ago

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 commented 6 days ago

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
github-actions[bot] commented 6 days ago

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]
github-actions[bot] commented 6 days ago

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]
brianschubert commented 6 days ago

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].

github-actions[bot] commented 4 days ago

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]