python / python/mypy

Allow defining type for dynamically generated types.

Ouverte
#19,360 4 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

feature topic-plugins
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Merge moyen
1 j 18 h
PR mergées (30 j)
54

Description

Feature
Add a way to allow defining or overriding types for dynamically generated types, such as pydantic's create_model.

Pitch
Pydantic provides a way to create models dynamically (create_model).
The problem is that mypy always complain about these models:

sample code (a.py)

from pydantic import create_model, BaseModel
from pydantic.fields import Field

GeneratedModel = create_model(
    "MyModel",
    some_field=(int, Field(default=0))
)


class MyModel(BaseModel):
    a: int
    model: GeneratedModel

mypy a.py

a.py:12: error: Variable "a.GeneratedModel" is not valid as a type  [valid-type]
a.py:12: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
Found 1 error in 1 file (checked 1 source file)

Currently, you are forced to add # type: ignore[valid-type] on each line where this model is used, which is a problem because it adds a lot of noise but also disables the check for all variables in the same line as this type: ignore.

I've tried things like these, with no luck:

# attempt 1
GeneratedModel: type[Any] = create_model(...)

# attempt 2
GeneratedModel = create_model(
    "MyModel",
    some_field=(int, Field(default=0))
)

GeneratedModel = cast(type[Any], GeneratedModel)

# attempt 3
def is_pydantic_model(model: Any) -> TypeGuard[BaseModel]:
    return isinstance(model, BaseModel)

GeneratedModel = create_model(
    "MyModel",
    some_field=(int, Field(default=0))
)
is_pydantic_model(GeneratedModel)

But I always get the same [valid-type] warning everywhere where this type is used.

The actual real workaround today is to define the type in a different file and import from somewhere else, but that is already marked as bug .

edit: Fixed FieldInfo->Field

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire l’exemple de a.py avec mypy et examiner le diagnostic valid-type actuel. La modification est terminée lorsqu’un type produit par pydantic's create_model peut être utilisé dans des annotations sans valid-type ignores répétés, tandis que les vérifications sans rapport sur la même ligne restent actives.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
compilers
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
30/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.