Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32.4k
Description
Originally posted by@AlexWaygood in#106354 (comment):
Tools/clinic/clinic.py:5039: error: Incompatible return value type (got"tuple[str, bool, dict[str | None, Any]]", expected"tuple[str, bool, dict[str, Any]]") [return-value] return name, False, kwargs ^~~~~~~~~~~~~~~~~~~
I think mypy is flagging a real bug in the code here. The issue is this block of code here:
cpython/Tools/clinic/clinic.py
Lines 5033 to 5039 ind694f04
caseast.Call(func=ast.Name(name)): | |
symbols=globals() | |
kwargs= { | |
node.arg:eval_ast_expr(node.value,symbols) | |
fornodeinannotation.keywords | |
} | |
returnname,False,kwargs |
The function is annotated as returntuple[str, bool, KwargDict]
, andKwargDict
is a type alias fordict[str, Any]
. It's important that the dictionary that's the third element of the tuple only has strings as keys. If it doesn't, then this will fail:
cpython/Tools/clinic/clinic.py
Line 4617 ind694f04
return_converter=return_converters[name](**kwargs) |
The code as written, however, doesn't guarantee that all the keys in thekwargs
dictionary will be strings. In the dictionary comprehension, we can see thatannotation
is anast.Call
instance. That means thatannotation.keywords
is of typelist[ast.keyword]
-- we can see this from typeshed's stubs for theast
module (which are an invaluable reference if you're working with ASTs in Python!):https://github.com/python/typeshed/blob/18d45d62aabe68fce78965c4920cbdeddb4b54db/stdlib/_ast.pyi#L324-L329. Ifannotation.keywords
is of typelist[ast.keyword]
, that means that thenode
variable in the dictionary comprehension is of typekeyword
, which means (again using typeshed'sast
stubs), thatnode.arg
is of typestr | None
:https://github.com/python/typeshed/blob/18d45d62aabe68fce78965c4920cbdeddb4b54db/stdlib/_ast.pyi#L516-L520. AKA, the keys in this dictionary are not always guaranteed to be strings -- there's a latent bug in this code!