Covariant type variable error in nested function
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 believe the below code should be allowed:
from typing import *
T_co = TypeVar('T_co', covariant=True)
class Col(Generic[T_co]):
def __init__(self, items: Iterable[T_co]) -> None:
self.items = items
def any(self, pred: Callable[[T_co], bool]) -> bool:
return any(map(pred, self.items))
def any_zero(self, fn: Callable[[T_co], int]) -> bool:
def pred(x: T_co) -> bool: # error: Cannot use type variable as a parameter
return fn(x) == 0
return self.any(pred)
I believe the purpose of this error is to disallow breaking variance, e.g.:
def unsafe(self) -> Callable[[T_co], int]:
def fn(t: T_co) -> int:
return id(t)
return fn
However, restricting variance on nested functions has both false positives (first example), and false negatives:
class Unsafe(Generic[T_co]):
def __init__(self, fn: Callable[[T_co], int]) -> None:
self.fn = fn
def get_fn(self) -> Callable[[T_co], int]:
return self.fn
The above code has no error, but is not type safe. I believe the proper way to check for this is to look at the signatures of each exposed method and verify that the type parameter is not used with the wrong parity.
mypy 0.740, python 3.7.5
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 riproducendo gli esempi di funzioni annidate con mypy 0.740 e confronta l’errore di varianza riportato con l’esempio di metodo esposto non sicuro. Traccia i controlli di varianza per le funzioni annidate e le firme dei metodi esposti. Il lavoro è completato quando l’esempio sicuro viene accettato, mentre i casi non sicuri vengono rifiutati senza introdurre falsi negativi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 25/100