:PROPERTIES:
:ID:       f892dbdd-0cb5-4204-bca0-09aafb41f7ca
:mtime:    20220522151003
:ctime:    20220522143325
:END:
#+title: Dataclasses

* Introduction
Le module /dataclasses/ :
 * Décrit par la [[https://www.python.org/dev/peps/pep-0557][PEP-557 - Data Classes]],
 * A été ajouté dans la version 3.7 de CPython,
 * Fournit un /decorator/ et des fonctions générant automatiquement des /dunder methods/, telles que ~__init__~ or
   ~__repr__~, aux classes (évite l'écriture de /boilerplate code/).

* Howto
** Dataclass /immutable/
#+BEGIN_SRC python :results output
from dataclasses import dataclass, field
from datetime import datetime
from typing import List
from uuid import UUID, uuid4

@dataclass(frozen=True)
class Tweets:
    """ Class to store tweets of users """

    tweet_body: str = None
    tweet_time: datetime = datetime.utcnow()
    tweet_id: UUID = uuid4()
    tweet_lang: str = 'en-IN'
    tweet_place: str = 'IN'
    tweet_retweet_count: int = field(repr=False, compare=False, default=0)
    tweet_hashtags: List[str] = field(default_factory=list)
    tweet_user_id: str = None
    tweet_user_name: str = None

from inspect import getmembers, isfunction

for member in getmembers(Tweets, predicate=isfunction):
    print(member)
#+END_SRC
#+RESULTS:
: ('__delattr__', <function __create_fn__.<locals>.__delattr__ at 0x7ff1127a78b0>)
: ('__eq__', <function __create_fn__.<locals>.__eq__ at 0x7ff1127a7790>)
: ('__hash__', <function __create_fn__.<locals>.__hash__ at 0x7ff1127a7940>)
: ('__init__', <function __create_fn__.<locals>.__init__ at 0x7ff1127a7550>)
: ('__repr__', <function __create_fn__.<locals>.__repr__ at 0x7ff11287c670>)
: ('__setattr__', <function __create_fn__.<locals>.__setattr__ at 0x7ff1127a7820>)

Il est nécessaire d'utiliser la méthode ~dataclasses.field~ et de préciser le paramètre ~default_factory~ pour l'utilisation d'objets /mutable/.

Les paramètres suivants de la méthode ~dataclasses.field~ permettent de contrôler le code généré :
 * ~repr~ : A mettre à ~False~ pour que l'attribut ne soit pas inclus dans la représentation (~__repr__~) de l'objet,
 * ~compare~: A mettre à ~False~ pour que l'attribut ne soit pas utilisé par la méthode ~__eq__~ de l'objet

* Références
 * [[https://medium.com/gitconnected/advanced-python-dataclasses-6a1e53bc4d8d][Advanced Python dataclasses - Medium]]
 * [[https://docs.python.org/3/library/dataclasses.html#dataclasses.dataclass][Dataclasses - Python]]
