python / python/mypy

Variadic tuple unpacking requires a star target -- why?

Aperta
#17,282 3 commenti 2 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

Bug Report

When attempting to unpack a tuple that uses Unpack, if you don't use a star target to capture the variadic tuple as a list, you get the error Variadic tuple unpacking requires a star target.

This is overly strict and prescriptivist and is not even applied consistently between similar type concepts within mypy.

  1. You definitely can do this if the lengths check out.
  2. pyright doesn't raise an error like this. You are simply on your own for length checking the unpacking of indeterminate length tuples, just like you are for list, another indeterminate length unpackable sequence.
  3. In fact, this is also how mypy treats unpacking list. It doesn't raise an error if you don't use a star target.
  4. I have a real use case where I want to do exactly this. I lay out my use case in this bug report to pyright: https://github.com/microsoft/pyright/issues/7987

To Reproduce

from typing import Tuple

from typing_extensions import Unpack


def foo() -> Tuple[int, Unpack[Tuple[str, ...]]]:
    return 1, "bar", "baz"

a, b, c = foo()  # error: Variadic tuple unpacking requires a star target  [misc]

d, e, f = [1, "bar", "baz"]  # OK

Gist URL: https://gist.github.com/mypy-play/4014976ca069e54b5c1fe86a45353f58
Playground URL: https://mypy-play.net/?mypy=master&python=3.12&gist=4014976ca069e54b5c1fe86a45353f58

Expected Behavior

No errors in the above example. a's type should be revealed to be int, and b and c's types should be revealed to be str.

Actual Behavior

An error, and a, b, and c are all revealed to be Any.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con la riproduzione minima nel report o con il relativo URL di mypy-play e confronta la diagnostica e i tipi rivelati per l’unpacking di tuple e liste. È completato quando l’assegnazione della tupla non produce errori, rivela a come int e b e c come str, e non introduce regressioni nel caso della lista.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
compilers
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
42/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.