"error: 'type' expects no type arguments, but 1 given" if type is aliased to another name
还没有人认领这个 Issue。
评估
调研方向
首先,在 generictype.py 中使用 mypy 运行报告的 Python 3.9 复现代码,并确认特定于 alias 的错误。跟踪 mypy 如何处理泛型内置类型的 alias,然后添加一个覆盖 Type = type 的回归测试,并验证检查能够成功,同时不会破坏现有的 list 和 dict 行为。
由索引模型根据 Issue 内容生成。
描述
Bug Report
With the implementation of PEP 585 in Python 3.9, type now accepts a generic parameter. This makes typing.Type obsolete, reflected in its deprecation.
However, if the type built-in is assigned to another name and then used in a type declaration, mypy produces an error.
This does not occur with other types affected by PEP 585, or at least not all of them. I can confirm list and dict do not exhibit this behavior.
To Reproduce
Example code file:
generictype.py
Type = type
class MyInt(int):
pass
x_type: Type[int] = MyInt
- Install mypy into a Python 3.9 environment.
- Execute
mypyagainst the script:mypy .\generictype.py. No arguments or configuration are required.
Expected Behavior
This should result in a success run with no errors:
> mypy .\generictype.py
Success: no issues found in 1 source file
Actual Behavior
mypy identifies an error:
> mypy .\generictype.py
generictype.py:3: error: "type" expects no type arguments, but 1 given
Found 1 error in 1 file (checked 1 source file)
Also note that using x_type: type[int] = MyInt directly eliminates the error.
Your Environment
- Mypy version used:
mypy 0.800 - Mypy command-line flags: None
- Mypy configuration options from
mypy.ini(and other config files): None - Python version used:
Python 3.9.1(inside a venv) - Operating system and version: Windows 10
Motivation
My actual code doesn't look exactly like the reproducing code above. I encountered it trying to make my code backwards compatible with Python 3.7+. My real usage looks more like this:
from __future__ import annotations
if sys.version_info >= (3, 9):
List = list
Type = type
else:
# Legacy generic type annotation classes
# Deprecated in Python 3.9
# Remove once we no longer support Python 3.8 or lower
from typing import List
from typing import Type
class MyCustomContext:
data: List[int]
def __init__(self):
self.data = []
def __enter__(self) -> MyCustomContext:
return self
def add(i: int) -> None:
self.data.append(i)
def __exit__(
self,
ex_type: Optional[Type[Exception]],
ex_value: Optional[Exception],
ex_traceback: Optional[TracebackType],
) -> None:
if ex_value is None and len(self.data) > 100:
raise ValueError('Too much data')
For the time being, I can work around this by just continuing to use typing.Type, but I'd like to eliminate this deprecated class.
- 主要语言
- Python
- 星标
- 20.6k
- 派生
- 3.3k
- 平均合并
- 1 天 18 小时
- 30 天内合并 PR
- 54
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
python/mypy 的其他 Issue
-
bug
难度 2/5 1-3 小时 新手友好度 75/100
-
bug
难度 2/5 1-3 小时 新手友好度 78/100
-
bug
难度 2/5 1-3 小时 新手友好度 76/100
-
documentation
难度 2/5 1-3 小时 新手友好度 72/100
-
bug topic-configuration topic-error-reporting
难度 2/5 1-3 小时 新手友好度 68/100
相似的 Issue
-
area/auth bug comp/agent P3 platform/discord type/security
难度 2/5 1-3 小时 新手友好度 88/100
NousResearch/hermes-agent#117848 ·
-
难度 2/5 1-3 小时 新手友好度 74/100
bancolombia/sentinel#23 ·
-
test md 未关闭CI
难度 2/5 1-3 小时 新手友好度 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
难度 2/5 1-3 小时 新手友好度 74/100
langchain-ai/deepagents#6450 ·
-
bug client
难度 2/5 1-3 小时 新手友好度 88/100