web-dev-qa-db-fra.com

Conversion de type de force In python Dataclass __init__ méthode

J'ai le dataclass très simple suivant:

import dataclasses

@dataclasses.dataclass
class Test:
    value: int

Je crée une instance de la classe mais au lieu d'un entier, j'utilise une chaîne:

>>> test = Test('1')
>>> type(test.value)
<class 'str'>

Ce que je veux réellement, c'est une conversion forcée au type de données que j'ai définie dans la défense de la classe:

>>> test = Test('1')
>>> type(test.value)
<class 'int'>

Dois-je écrire le __init__ Méthode manuellement ou y a-t-il un moyen simple d'y parvenir?

17
johnson

Vous pouvez y parvenir en utilisant le __post_init__ méthode:

import dataclasses

@dataclasses.dataclass
class Test:
    value : int

    def __post_init__(self):
        self.value = int(self.value)

Cette méthode s'appelle après le __init__ méthode

https://docs.python.org/3/library/dataclasses.html#post-init-processing

2
Merig

Ouais, la réponse facile consiste à faire la conversion vous-même dans votre propre __init__(). Je fais ça parce que je veux mes objets frozen=True.

Pour la validation de type, Pydandic prétend le faire, mais je ne l'ai pas encore essayé: https://pydantic-docs.helpmanual.io/

0
Lars P