Files
org-roamings/20211230101535-python.org

242 lines
14 KiB
Org Mode
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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