Record Types
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 25/100
Piste de recherche
Aucun fichier d’implémentation, test ou point d’entrée n’est nommé. Commencez par lire les approches proposées pour TypedDict et type-level keys, puis examinez les discussions liées sur les TypedDicts anonymes, les dépendances génériques et les génériques variadiques. La tâche serait terminée lorsqu’une manière générique convenue de typer des dataframes avec différents types de colonnes existerait, mais l’issue ne définit ni implémentation concrète ni plan de test.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
I would like to be able to type a Dataframe like object with MyPy, where different columns have different types and you can get each as column as an attribute on the dataframe. This is how libraries like Pandas and Ibis work.
Generally, this requires a function to return different types by mapping string literals to different types (record kinds).
Here is a mock example implemented in Typescript, which checks properly:
class Column {
mean(): number {
return 0;
}
}
class GeoColumn extends Column {
length(): number {
return 0;
}
}
class Dataframe<T extends { [key: string]: Column} > {
constructor(private cols: T) {
}
getColumn<K extends keyof T>(name: K): T[K] {
return this.cols[name]
}
}
const d = new Dataframe({ name: new Column(), location: new GeoColumn() });
d.getColumn("name").mean();
// We can call `length` because this is a GeoColumn
d.getColumn("location").length();
Possible Syntaxes
Here are a few possible ways this could be spelled in Python:
self as TypedDict
Since we already have a TypedDict construct one of the least invasive approaches is to type self as a TypeDict.
This would probably require anonymous TypeDicts, which was proposed previously (https://github.com/python/mypy/issues/985#issuecomment-250640149).
It would also required TypedDicts to be able to take generic parameters.
class Column:
def mean(self) -> int:
return 0
class GeoColumn(Column):
def length(self) -> int:
return 0
T = TypeVar("T", bound=Dict[str, Column])
K = TypeVar("K", bound=str)
V = TypeVar("V", bound=Column)
class Dataframe(Generic[T]):
def __init__(self, cols: T):
self.cols = cols
def __getattr__(self: Dataframe[TypedDict({K: V})], name: K) -> V:
return self.cols[name]
d = Dataframe({"name": Column(), "location": GeoColumn()})
d.name.mean()
d.location.length()
Type Level .keys and __getitem__
Another option would be to mirror how Typescript does this, by introducing type level keys and __gettitem__ functions. This would also require generic to depend on other generics (https://github.com/python/mypy/issues/2756).
T = TypeVar("T", bound=Dict[str, Column])
K = TypeVar("K", bound=KeyOf[T])
class Dataframe(Generic[T]):
def __init__(self, cols: T):
self.cols = cols
def __getattr__(self, name: K) -> GetItem[T, K]:
return self.cols[name]
Conclusion
I would like to have a way to type Dataframes that have different column types in a generic way. This is useful for typing frameworks like Ibis or Pandas.
This is somewhat related to variadic generics I believe (https://github.com/python/typing/issues/193). Also related: https://github.com/dropbox/sqlalchemy-stubs/issues/69
- Langage dominant
- Python
- Étoiles
- 1.8k
- Forks
- 302
- Merge moyen
- 23 h
- PR mergées (30 j)
- 8
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de python/typing
-
topic: typing spec
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
-
topic: typing spec
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
topic: documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
-
topic: documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
-
topic: conformance tests topic: typing spec
Difficulté 3/5 1-2 jours Accessibilité débutants 72/100
Toutes les issues de python/typing
Issues similaires
-
bug confirmed issue
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
open-webui/open-webui#30750 · 1 commentaire ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
OpenwaterHealth/openmotion-bloodflow-app#604 · 1 commentaire ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
-
good first issue
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100