`*args` and `**kwargs` are allowed even to methods with no arguments
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
I am working on removing dict and **kwargs hack from mypy after https://github.com/python/typeshed/pull/8517 is merged.
But, I found a very confusing thing in how *args and **kwargs are checked.
Simple repro (all of the examples below work):
def some() -> None: ...
# args
some(*[1, 2])
args = [1, 2]
some(*args)
# kwargs
some(**{'a': 1})
kw = {'a': 2}
some(**kw)
All of these would raise TypeError in runtime.
I think that the main idea was to allow calls like some(*[]) and some(**{}) which are fine in runtime.
This affects how overloads are selected in complex cases like:
class dict2(Generic[KT, VT]):
@overload
def __init__(self, __iterable: Iterable[Tuple[KT, VT]]) -> None: pass
@overload
def __init__(self: "dict2[str, VT]", __iterable: Iterable[Tuple[str, VT]], **kwargs: VT) -> None: pass
it = [(1, 'x')]
kw = {'x': 'y'}
reveal_type(dict2(it, **kw))
It looks like the second @overload will raise an error: Iterable[Tuple[str, VT]] is required, but Iterable[Tuple[int, str]] is given.
But it does not, because of how **kwargs are silently ignored. So, first @overload always matches.
This is broken, if you ask me 😢
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con il comportamento di controllo delle chiamate e selezione degli overload per *args e **kwargs descritto nel reproducer. Verifica come le chiamate a una funzione senza argomenti gestiscono gli argomenti spacchettati non vuoti e gli argomenti con nome, preservando al contempo lo spacchettamento vuoto valido. Il lavoro è completo quando le chiamate non valide a runtime vengono rifiutate e l'esempio di overload dict2 seleziona correttamente o segnala gli errori.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- devtools
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100