:PROPERTIES:
:ID:       4fabfe6a-b104-464f-8a87-dfd7d761dbcc
:mtime:    20221003215204
:ctime:    20211230101535
:END:
#+title: Python
#+filetags: :Python:

* Language
** Classe
*** Méthodes dunder (Double UNDERscore method)
**** [[id:5803422c-c089-4369-93cc-80caca71a26b][La méthode __bool__]]
**** [[id:aaf77222-82d2-492c-bf5f-2dd47659b1be][La méthode __new__]]
**** [[id:dc2a8693-7158-4155-8eff-fc35a21a077d][La méthode __missing__]]
**** [[id:0d9a7351-babd-4394-9d95-1d40cb46f615][La méthode __prepare__]]
**** [[id:d1877b3b-3fe5-43d5-9be2-afb5ffe6b918][La méthode __hash__]]
**** Les méthodes __repr__ et __str__
La méthode ~__repr__~ est utilisée pour le debug quand ~__str__~ pour l'utilisateur (/good looking strings/).
*** [[id:1512a18b-221a-4f15-90a0-9ccac023dfd6][Method Resolution Order]]
** Types
*** [[id:f892dbdd-0cb5-4204-bca0-09aafb41f7ca][Dataclasses]]
*** [[id:67410dad-d959-4029-b281-9bf1c9e69ede][Generator]]
*** [[id:234f4590-b484-4286-9dbd-49612f4657be][NamedTuple]]
*** [[id:cc0e3fd0-2832-4bf6-909f-354507f7ed11][Set et frozenset]]
*** [[id:8b686fdd-2abd-459d-8d8d-0c57915de8fb][String]]
*** [[id:ed7551e9-706c-4bc3-90fb-e5a63a4a7903][Table de hashage]]
** Fonctions Built-in
*** [[id:487f57f5-e9fc-4df7-ae14-b41f9c1fa186][Fonction vars]]
*** [[id:acda43fa-70be-4939-9128-47114e48e4cb][Fonction zip]]
** Functools module
*** [[id:25d994fd-375b-429d-af38-6afba818159f][functools.singledispatch]]


* Frameworks
** Web
*** [[id:26b04294-75e8-4043-a9a6-a20acd952963][Flask]]


* UI
** GUI
*** [[https://kivy.org/#home][Kiwi]]
*** [[https://www.libavg.de/site/projects/libavg/wiki/FeatureList][libAvg]]
*** [[https://pysimplegui.readthedocs.io/en/latest/][PySimpleGui]]
*** [[https://pyforms.readthedocs.io/en/latest/][Pyforms]]
Framework permettant d'exécuter une IHM dans 3 environnements différents : Desktop GUI, terminal et web.
*** [[https://www.qt.io/qt-for-python][Pyside]]
Bindings python pour Qt.
** CLI
*** [[https://typer.tiangolo.com/https://typer.tiangolo.com/][Typer]]
** Text UI
*** [[id:6cc56ee4-6d42-4d50-beb3-bb22a98298dd][textual]]


* Outils
** Analyseur statique de code
*** [[id:1d258869-5421-496a-b296-2d157ebdf3b6][mypy]]
*** [[id:113a938e-3fb2-45cb-ae6e-41801418139b][bandit]]
** Automatisation de tests
*** [[https://nox.thea.codes/en/stable/][Nox]]
Outil en ligne de commande permettant d'automatiser les tests dans multiples environnements Python. Comme Tox, à la
différence, que la configuration est effectuée depuis un fichier Python (et non pas de configuration).
*** [[https://tox.wiki/en/latest/][Tox]]
Outil en ligne de commande permettant d'automatiser les tests dans multiples environnements Python.
** Couverture de code
*** [[https://github.com/plasma-umass/slipcover][Slipcover]]
Outil de mesure de couverture de code plus rapide que [[https://github.com/nedbat/coveragepy][coverage.py]].
** Debugger
*** [[https://github.com/ionelmc/python-manhole][Manhole]]
Service (interface via une socket Unix permettant l'accès à un REPL) permettant l'inspection d'un programme en cours d'exécution.
** Formatter
*** [[https://github.com/hhatto/autopep8][autopep8]]
Utilitaire formattant le code afin de respecter la [[https://www.python.org/dev/peps/pep-0008/][PEP8]] guideline. Il est basé sur l'analyse de code effectuée par
[[https://github.com/PyCQA/pycodestyle][pycodestyle]]. ~Autopep8~ ne modifie que les espaces contenus dans le code (l'option ~--aggressive~ permet d'accroître le
pouvoir d'~autopep8~ et le laisser modifier le code).
*** [[https://github.com/PyCQA/isort][isort]]
Outil classant les imports par ordre alphabétique, les séparant par section et par type.
*** [[https://black.readthedocs.io/en/stable/][Black]]
Formatter n'appliquant que le style [[https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html][/black/]]. Il accepte la même synthaxe de contrôle que YAPF.
*** [[https://github.com/google/yapf][YAPF]]
En plus de vérifier la conformité avec la  [[https://www.python.org/dev/peps/pep-0008/][PEP8]], YAPF formatte le code afin de respecter un style (approche basée sur
~clang-format~ et similaire à ~gofmt~).
** Générateur de données
*** [[https://github.com/lk-geimfari/mimesis][Memesis]]
Génération de données pouvant être utilisées pour:
 * Remplir une base de données de test,
 * Créer une faux /API endpoint/,
 * Créer des fichiers JSON ou XML d'après une structure arbitraire.
*** [[https://github.com/joke2k/faker][Faker]]
Génération de données.
** Gestion dépendances
*** [[id:01f24d29-e833-4bfa-acb0-95140800d081][poetry]]
** Mockup
*** [[https://github.com/spulec/freezegun][FreezeGun]]
Mockup du module [[https://docs.python.org/fr/3/library/datetime.html][datetime]] permettant de simuler des changements de temps.
*** [[https://github.com/getsentry/responses][Responses]]
Mockup du module [[https://docs.python-requests.org/en/latest/][Requests]] permettant de simuler les réponses d'un serveur HTTP.
** Profiling
*** [[https://docs.python.org/3/library/profile.html#][cProfile]]
Programme fournissant des /deteministic profiling/ de programmes (indique le nombre d'appel de chaque
méthode et le temps passé).
*** [[https://github.com/bloomberg/memray][Menray]]
/Memory profiler/ traçant les allocations mémoire dans le code Python, les modules extensions et l'interpréteur.
*** [[https://jiffyclub.github.io/snakeviz/][SnakeViz]]
Visualisation des rapports de /cProfile/ (web browser).
*** [[https://github.com/brandtbucher/specialist][Specialist]]
Outil permettant d'indiquer le code optimisé par la spécialisation du bécote (cf. [[https://peps.python.org/pep-0659/][PEP 659 – Specializing Adaptive Interpreter]]).xo
*** [[https://github.com/nvdv/vprof][vprof]]
Profiling de programmes python permettant de surveiller le temps d'exécution et l'usage mémoire.
~vprof -c hpm "<cmd>"~
** Test de charge
*** [[https://github.com/locustio/locust][Locust]]
Outil permettant de tester la tenue en charge d'applications (initialement web servers).

** Traceur d'exécution de code
*** [[https://github.com/ionelmc/python-hunter][Python-hunter]]
Traçage des appels de fonctions, du code exécuté et des valeurs retournées (vs. smiley, pytrace, PySnooper).

* Implémentations
** CPython
Implémentation de référence du language Python.
*** Développement de CModules
**** Références
 * [[https://pythondev.readthedocs.io/][Python development notes - Victor Stinner]]
*** Debug
Activation du mode développeur ~python -X dev~ ou ~PYTHONDEVMODE=1 python~ (cf. [[https://docs.python.org/dev/library/devmode.html][Python Development Mode]]).

** Cinder
Implémentation CPython optimisée par Instagram :
 * [[https://engineering.fb.com/2022/05/02/open-source/cinder-jits-instagram/][Jit]]


* Modules intéressants
** Bases de données
*** [[https://spark.apache.org/docs/latest/api/python/][PySpark]]
Binding Python a /Apache Spark/ permettant le traitement de bases de données massives, lorsque /Pandas/ devient trop
lent.
** Benchmarking
*** [[id:4e351659-8a96-44af-bacb-f548ea35913e][timethese]]
** CSV
*** [[https://csvkit.readthedocs.io/en/latest/index.html][csvkit]]
Ensemble d'outils en ligne de commande pour convertir en csv et pour les manipuler.
** Graphique
*** [[https://github.com/tfardet/mpl_chord_diagram][mpl_chord_diagram]]
Génération de [[https://en.wikipedia.org/wiki/Chord_diagram_(information_visualization)][Chord diagrams]] avec /matplotlib/.
*** [[https://networkx.org/][networkX]]
Représentation de graphs.
*** [[https://github.com/pwaller/pyfiglet][pyfiglet]]
Représentation de texte sous forme d'ASCII art font.
** Logs
*** [[https://github.com/itamarst/eliot][eliot]]
Génération de logs sous forme d'arbre.
*** [[https://www.structlog.org/en/stable/index.html][structlog]]
Formattage de logs.
** Manipulation de classes
*** [[https://github.com/MagicStack/immutables][Immutables]]
Création de tables de hashage /immutables/.
*** [[https://www.attrs.org/en/stable/][attrs]]
Création de classes en évitant l'écriture du /boilerplate code/ (possibilité de créer des objets /immutables/).
** Médias
*** [[https://github.com/ytdl-org/youtube-dl][youtube-dl]]
Téléchargement de vidéo depuis youtube, utilisé par mpv.
*** [[https://github.com/goldsmith/Wikipedia][wikipedia]]
Wrapper permettant l'accès au contenu de wikipedia.
** Sérialization/déserialization
*** [[https://github.com/ICRAR/ijson][ijson]]
Parser JSON ne nécessitant pas que l'ensemble de la donnée soit chargée pour la parser (optimisation de la mémoire
consommée, cf. [[https://pythonspeed.com/articles/json-memory-streaming/][JSON memory streaming - Pythonspeed]]).
** Stockage des données
*** [[https://github.com/theskumar/python-dotenv][dotenv]]
** Surveillance de fichers
*** [[https://watchfiles.helpmanual.io/][watchfiles]]
Surveillance de fichiers basé sur la librarie Rust /Notify/.
** Vulnérabilités/Cyber
*** [[id:ba4c7c25-ee27-4b5e-8ef7-ba2ecc34f127][defusedxml]]
** Web-scaping
*** [[https://scrapy.org/][scrapy]]
Framework d'extraction de données depuis des site web.


* Modules amustants
*** [[https://github.com/gahjelle/pythonji][pythonji]]
Utilisation d'emojis pour l'écriture de code en Python


* Performances
** [[id:b9f392bd-bd45-4e9e-94ec-b19caedff86f][List vs tuple]]
** [[id:26e1fdfb-1f8e-4c62-a08f-468a56ab03c8][Peephole optimization]]
** [[id:c0d562c7-9d2f-4f35-b7b1-f6b6ca5273f9][Interning optimization]]
** [[id:05864d6a-7a05-4c11-af14-4faebfdd1926][L'attribut de classe __slots__]]

* Génération et déploiement
** Génération d'un artifact distribuable depuis le code source
 * Utilisation de [[https://setuptools.pypa.io/en/latest/][setuptools]].
 * Template de fichier [[https://github.com/pypa/sampleproject/blob/main/setup.py][setup.py]].
** Stockage et distribution de l'artifact
 * Utilisation de [[https://pip.pypa.io/en/stable/][pip]].
*** Les fichiers ~requirements.txt~
 * Il peut être intéressant de produire différents fichiers ~requirements.txt~ selon l'usage souhaité:
   * ~/requirements/app.txt~ pour les dépendances nécessaires à l'exécution du code,
   * ~/requirements/test.txt~ pour les dépendances nécessaires aux tests du code.
 * Dans un environnement de dev virtualisé, la commande ~pip freeze~ permet d'obtenir l'ensemble des dépendances et
   leurs version, récursivement.
 * [[https://github.com/jazzband/pip-tools][Pip-tools]] propose des outils permettant de simplifier la gestion des dépendances:
   * ~pip-compile --generate-hashes -o ./requirements.txt~ permet la génération de fichiers ~requirements.txt~ depuis les ~setup.py~ ou ~requirements.in~ d'un package,
   * La génération de hashes (option ~generate-hashes~) permet la vérification, lors de l'installation des dépendances,
     d'en vérifier la non altération (par rapport au paquet utilisé lors de la génération de notre package),
   * ~pip-compile --generate-hashes --extra dev -o ./requirements_dev.txt~ permet la génération d'un fichier
     ~requirements_dev.txt~ comprenant les dépendances identifiées par les fichiers ~install_requires~ et
     ~extras_require[dev]~.
 * [[https://devpi.net/docs/devpi/devpi/stable/+d/index.html#][devpi]] fournit un serveur PyPI-compatible (mirroir PyPI) et un utilitaire en ligne de commande pour les activités de mise en paquet,
   test (intégration avec Jenkins) et livraison.
** Gestion des dépendances et de leur version et leur cloisement par projet
 * Utilisation de [[https://python-guide-pt-br.readthedocs.io/fr/latest/dev/virtualenvs.html][virtualenv]],
 * utiliser ~python -m pip~ et ~python -m venv~ (exécution du module en tant que script, au lieu de ~pip~ et ~virtualenv~) permet d'éviter les incohérences
   entre les différents répertoires des packages Python (cas lorsqu'un répertoire est présent dans le ~PYTHONPATH~ et qu'un autre l'est dans le ~PATH~).

* Optimisations
** Création automatique de constantes numériques lors de la génération du bytecode
#+BEGIN_SRC python :results output
y = x * 5 / 9 # Une multiplcation par un entier, suivie par une division par un entier
y = x * (5 / 9) # Le ratio 5 / 9 est calculé lors de la génération du bytecode associé à la ligne : une seule multiplication par un flottant lors de l'exécution de l'opération
#+END_SRC
A partir de Python3.11, les opérations entre types identiques (ie: int+int) peuvent être spécialisées (cf. [[https://www.youtube.com/watch?v=tNs18GDmAfg][Python Perf: Specializing, Adaptive Interpreter - Talk Python Live Stream - YouTube]] - augmentation des perfs).

* Tips
** [[id:24408701-21d8-4f4e-aed9-c58746df2244][Différence entre les opérateurs + et +=]]
** [[id:a32ab138-f9a8-4d61-9c09-97953c5a0a92][type == object]]
** [[id:16d16a4b-6a4c-4597-a45f-1a99f2cb9f29][Any et all d'un iterable vide]]
** [[id:e9a0cb94-ee68-4dfd-9013-c83ce2a18481][Ordre de résolution des attributs]]
** [[id:279b5e79-6918-432c-85fa-2fbefc06619a][Attribut imag des types numériques]]
** [[id:831fbfd2-c668-4099-b2d7-ecae734b9ec4][Evaluation tardive]]
** [[id:f7c05933-90e6-4a9c-acd5-1f0baf62f07f][Arrondir les flottants en python]]
** [[id:4ef76164-0e67-410a-8d26-b03071a0cc41][Compter la fréquence des éléments d'une liste]]
** [[id:9bdede16-5137-4393-a027-a5afbffd1618][Génération chaine de caractères aléatoires]]
** [[id:cb3c63b9-6452-4016-9b2f-a25784941d5d][List vs deque]]
** [[id:e9adeaaa-701a-4473-a30b-94f1e744c6d1][Obtenir la clé d'un dictionnaire pour laquelle la valeur est la plus petite]]
** [[id:fa7e728b-dd2a-4d30-8f4b-e87813dc5f33][Modifier le style du texte affiché sur une console]]
** [[id:20753ab5-70c3-4c8f-b261-56832cd5392c][Trouver le premier élément d'un iterable satisfaisant avec any]]

* Howtos
 * [[https://towardsdatascience.com/how-to-make-gifs-in-python-664d15ed4256][How to make GIFs in Python - Medium]]
