IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Utilisation de Dataclass


Sujet :

Python

  1. #1
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Utilisation de Dataclass
    Bonjour

    @dataclass Solution presente avec la version 3.7 de Python

    https://docs.python.org/fr/3/library/dataclasses.html

    Je me demandais comment utiliser les dataclass afin de définir un objet date répondant à un format spécifique voici ce que j'ai trouvé
    mais autre chose je veux définir que pour LIBR01 , LIBR02 les valeurs possible soit uniquement celle note dans le commanatire avez-vous une idée ?




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from dataclasses import dataclass
    from datetime import datetime
     
     
    @dataclass
    @dateformat('%d/%m/%Y') 
    class Carte(): 
    	TYPCAR : str	 #	Type de carte / version
    	NUMCAR : int	 #	Numéro de carte
    	NUCARM : int	 #	Numéro de carte multiple
    	DATEDI : datetime	 #	Date d'édition 
    	DATEFU : datetime	 #	Date d'envoi 
            LIBR01 : str  # valeur possible KOSP ou blanc
            LIBR02 : str #   valeur possible OPAL ou blanc


    Inspiration pour le dataformat https://pypi.org/project/dataclass-csv/ ceci dit la version originel est plustôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @dateformat('%Y/%m/%d')

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Salut,

    Je ne sais pas d'où vous sortez "dateformat".
    En tous cas, si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from dataclasses import dataclass
     
    @dataclass
    class A:
        x : int
    vous créer une mécanique qui permettra une vérification "statique" des types.
    Dit autrement, rien n'empêche d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a = A('toto')
    >>> a.x
    'toto'
    >>> type(a.x)
    <class 'str'>
    >>>
    Ceci dit, concernant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mais autre chose je veux définir que pour LIBR01 , LIBR02 les valeurs possible soit ...
    rien ne vous empêche de s/classer str pour créer des "class" class_LIBR1, class_LIBR2 qui ... traduiront cela.

    - W

  3. #3
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Dommage
    Effectivement il ne s'agit que d'information statique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    from dataclasses import dataclass
    from datetime import datetime
     
    from dataclass_csv import DataclassReader, dateformat
     
     
    @dataclass
    #@dateformat('%Y/%m/%d')
    @dateformat('%d/%m/%Y')
    class User():
        name: str
        email: str
        birthday: datetime
     
    class fil():
        def __init__(self,dbNAME,nomrepertoire,Base):
            self.dbNAME =  dbNAME 
            self.nomrepertoire = nomrepertoire
            self.Base = Base
        def __str__(self):
           return self.dbNAME  + ' ' + self.nomrepertoire + ' self.Base'
     
     
    if __name__ == '__main__':
        fic  ='C:\\Users\\User\\eclipse-workspace\\Fube2\\src\\users.csv'
     
        rid = User('MAxi','OP@oran.fr', '15/01/1874')
        print(rid)
     
        rid = User('MAxi',465, '15/01/1874')
        print(rid)
     
     
     
        with open(fic) as f:
            reader = DataclassReader(f, User)
            for row in reader:
                print(row)
     
        c1 =fil('MAxi','OP@oran.fr', '15/01/1874')
        print(c1)
        c1 =fil('MAxi',465, '15/01/1874')
        print(c1)
    Mais même avec une classes définie différement, rien n'interdit de mettre une valeur inadaptée à ce que l'on veux exprimer dans une définition de class.


    Résultat du code

    User(name='MAxi', email='OP@oran.fr', birthday='15/01/1874')
    User(name='MAxi', email=465, birthday='15/01/1874')
    User(name='jean', email='toto@fr.fr', birthday=datetime.datetime(1867, 1, 19, 0, 0))
    User(name='cool', email='titi@fr.fr', birthday=datetime.datetime(1107, 8, 19, 0, 0))
    User(name='Edit', email='edit@test.com', birthday=datetime.datetime(2318, 11, 20, 0, 0))
    MAxi OP@oran.fr self.Base
    Traceback (most recent call last):
      File "C:\Users\User\eclipse-workspace\TestDivers\ex0000007.py", line 43, in <module>
        print(c1)
      File "C:\Users\User\eclipse-workspace\TestDivers\ex0000007.py", line 21, in __str__
        return self.dbNAME  + ' ' + self.nomrepertoire + ' self.Base'
    TypeError: can only concatenate str (not "int") to str
    On va provoque une erreur sur l'utilisation du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def __str__(self):
           return self.dbNAME  + ' ' + self.nomrepertoire + ' self.Base'
    qui ce veux ici adapter a des variables de type String et non utilisable pour des valeur numérique.
    Biensur il pourrait être util d'adpter la définition du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def __str__(self):
           return self.dbNAME  + ' ' + self.nomrepertoire + ' self.Base'
    Ce qui est pratique c'est qu'avec la solution @dataclass ce paramétrage est autoimplémenté dans le code final.

  4. #4
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Pour en revenir a la seconde question
    Je recherche comment realiser des controles de cohérence
    1. en valeur dans la définition d'une class.
    2. en type dans la définition d'une class.



    Comme y implémenter de telle contrainte et peut on alors générer des erreurs bloquant le code dans son exécution en générant des erreurs de type dans le meme esprit que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TypeError: can only concatenate str (not "int") to 
     
    str

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Je recherche comment realiser des controles de cohérence
    1. en valeur dans la définition d'une class.
    2. en type dans la définition d'une class.
    Il me semble vous avoir déjà répondu.

    - W

  6. #6
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut Dommage que cela ne fonctionne pas
    Cas N°1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # coding: utf-8  
     
    from dataclasses import dataclass
    @dataclass
    class InventoryItem:
        '''Class for keeping track of an item in inventory.'''
        name: str 
        unit_price: float
        quantity_on_hand: int = 0
        prenom : str = 'pol'
     
        def total_cost(self) -> float:
            return self.unit_price * self.quantity_on_hand
     
    # Base Application
    if __name__ == '__main__':
        nouveau =InventoryItem('toto', 150.45 )
        print(nouveau)
        nouveau =InventoryItem('toto', 1050.75 , 45 )
        print(nouveau)
    Pas de soucis à l'exécution

    Cas N°2 Dommage lorsque l'on souhaite avoir une valeur par defaut sur le premier champ La c'est refusé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # coding: utf-8  
     
    from dataclasses import dataclass
    @dataclass
    class InventoryItem:
        '''Class for keeping track of an item in inventory.'''
        name: str ='maxi'
        unit_price: float
        quantity_on_hand: int = 0
     
     
        def total_cost(self) -> float:
            return self.unit_price * self.quantity_on_hand
     
     
     
    # Base Application
    if __name__ == '__main__':
        nouveau =InventoryItem('toto', 150.45 )
        print(nouveau)
        nouveau =InventoryItem('toto', 1050.75 , 45 )
        print(nouveau)
    il semble que l'exemple N°2 ne soit pas accepter par la solution des décorateurs dataclasses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Traceback (most recent call last):
      File "ex2.py", line 4, in <module>
        @dataclass
      File "python37\lib\dataclasses.py", line 966, in dataclass
        return wrap(_cls)
      File "python37\lib\dataclasses.py", line 958, in wrap
        return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen)
      File "python37\lib\dataclasses.py", line 879, in _process_class
        else 'self',
      File "\python37\lib\dataclasses.py", line 466, in _init_fn
        raise TypeError(f'non-default argument {f.name!r} '
    TypeError: non-default argument 'unit_price' follows default argument

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Dommage que cela ne fonctionne pas
    Je ne vois pas de class class_LIBR1, class_LIBR2 ou équivalentes.
    Donc ce n'est pas ce que je vous ai suggéré.

    - W

  8. #8
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Je ne vois pas de class class_LIBR1, class_LIBR2 ou équivalentes.
    Donc ce n'est pas ce que je vous ai suggéré.

    - W
    Effectivement il n'y a pas de rapport directe avec votre suggestion , il s'agit simplement d'une interrogation sur l'utilisation de DATACLASS en rapport avec le theme générale.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo