: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 ""~ ** 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]]