Files
org-roamings/20220522143325-dataclasses.org
2022-06-04 12:57:39 +02:00

59 lines
2.4 KiB
Org Mode

: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]]