{"id":22249029,"url":"https://github.com/coditheck/google_python_style","last_synced_at":"2026-04-29T11:01:31.823Z","repository":{"id":159893768,"uuid":"609193060","full_name":"CodiTheck/google_python_style","owner":"CodiTheck","description":null,"archived":false,"fork":false,"pushed_at":"2023-05-08T18:25:14.000Z","size":44,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-01-30T10:44:25.835Z","etag":null,"topics":["google-python","python","python-style"],"latest_commit_sha":null,"homepage":"https://google.github.io/styleguide/pyguide.html","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CodiTheck.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-03T15:15:06.000Z","updated_at":"2023-06-01T18:09:48.000Z","dependencies_parsed_at":"2024-08-17T03:47:34.310Z","dependency_job_id":null,"html_url":"https://github.com/CodiTheck/google_python_style","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodiTheck%2Fgoogle_python_style","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodiTheck%2Fgoogle_python_style/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodiTheck%2Fgoogle_python_style/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodiTheck%2Fgoogle_python_style/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CodiTheck","download_url":"https://codeload.github.com/CodiTheck/google_python_style/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245458196,"owners_count":20618693,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["google-python","python","python-style"],"created_at":"2024-12-03T06:21:25.183Z","updated_at":"2026-04-29T11:01:26.781Z","avatar_url":"https://github.com/CodiTheck.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Guide de style Python de Google\n![](https://img.shields.io/badge/contact-dr.mokira%40gmail.com-blueviolet)\n![](https://img.shields.io/badge/lastest-2023--05--08-success)\n![](https://img.shields.io/badge/status-en%20r%C3%A9daction%20-yellow)\n\n\u003cdetails\u003e\n  \u003csummary\u003eTable des Contenus\u003c/summary\u003e\n\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"#1-contexte\"\u003e1 Contexte\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#2-règle-du-langage-python\"\u003e2 Règle du langage Python\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#21-lint\"\u003e2.1 Lint\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#22-importations\"\u003e2.2 Importations\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#23-les-paquets\"\u003e2.3 Les paquets\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#24-les-exceptions\"\u003e2.4 Les exceptions\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#25-etat-global-mutable\"\u003e2.5 État global mutable\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#26-classes-et-fonctions-imbriquées-locales-intérieures\"\u003e2.6 Classes et fonctions imbriquées/locales/intérieures\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#27-comprehensions-expressions-de-generator\"\u003e2.7 Comprehensions \u0026amp; Expressions de Generator\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#28-itérateurs-et-opérateurs-par-défaut\"\u003e2.8 Itérateurs et opérateurs par défaut\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#29-générateurs\"\u003e2.9 Générateurs\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#210-fonction-lambda\"\u003e2.10 Fonction Lambda\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#211-expressions-conditionnelles\"\u003e2.11 Expressions conditionnelles\u003c/a\u003e\u003c/li\u003e\n        \u003c!-- \u003cli\u003e\u003ca href=\"#212-default-argument-values\"\u003e2.12 Default Argument Values\u003c/a\u003e\u003c/li\u003e --\u003e\n        \u003c!-- \u003cli\u003e\u003ca href=\"#213-properties\"\u003e2.13 Properties\u003c/a\u003e\u003c/li\u003e --\u003e\n        \u003c!-- \u003cli\u003e\u003ca href=\"#214-truefalse-evaluations\"\u003e2.14 True/False Evaluations\u003c/a\u003e\u003c/li\u003e --\u003e\n        \u003c!-- \u003cli\u003e\u003ca href=\"#216-lexical-scoping\"\u003e2.16 Lexical Scoping\u003c/a\u003e\u003c/li\u003e --\u003e\n        \u003c!-- \u003cli\u003e\u003ca href=\"#217-function-and-method-decorators\"\u003e2.17 Function and Method Decorators\u003c/a\u003e\u003c/li\u003e --\u003e\n        \u003c!-- \u003cli\u003e\u003ca href=\"#218-threading\"\u003e2.18 Threading\u003c/a\u003e\u003c/li\u003e --\u003e\n        \u003c!-- \u003cli\u003e\u003ca href=\"#219-power-features\"\u003e2.19 Power Features\u003c/a\u003e\u003c/li\u003e --\u003e\n        \u003c!-- \u003cli\u003e\u003ca href=\"#220-modern-python\"\u003e2.20 Modern Python: from __future__ imports\u003c/a\u003e\u003c/li\u003e --\u003e\n        \u003c!-- \u003cli\u003e\u003ca href=\"#221-type-annotated-code\"\u003e2.21 Type Annotated Code\u003c/a\u003e\u003c/li\u003e --\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003c!--\u003cli\u003e\u003ca href=\"#s3-python-style-rules\"\u003e3 Python Style Rules\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#s3.1-semicolons\"\u003e3.1 Semicolons\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.2-line-length\"\u003e3.2 Line length\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.3-parentheses\"\u003e3.3 Parentheses\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.4-indentation\"\u003e3.4 Indentation\u003c/a\u003e\n          \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#s3.4.1-trailing-commas\"\u003e3.4.1 Trailing commas in sequences of items?\u003c/a\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.5-blank-lines\"\u003e3.5 Blank Lines\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.6-whitespace\"\u003e3.6 Whitespace\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.7-shebang-line\"\u003e3.7 Shebang Line\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.8-comments-and-docstrings\"\u003e3.8 Comments and Docstrings\u003c/a\u003e\n          \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#s3.8.1-comments-in-doc-strings\"\u003e3.8.1 Docstrings\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.8.2-comments-in-modules\"\u003e3.8.2 Modules\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.8.2.1-test-modules\"\u003e3.8.2.1 Test modules\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.8.3-functions-and-methods\"\u003e3.8.3 Functions and Methods\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.8.4-comments-in-classes\"\u003e3.8.4 Classes\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.8.5-block-and-inline-comments\"\u003e3.8.5 Block and Inline Comments\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.8.6-punctuation-spelling-and-grammar\"\u003e3.8.6 Punctuation, Spelling, and Grammar\u003c/a\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.10-strings\"\u003e3.10 Strings\u003c/a\u003e\n          \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#s3.10.1-logging\"\u003e3.10.1 Logging\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.10.2-error-messages\"\u003e3.10.2 Error Messages\u003c/a\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.11-files-sockets-closeables\"\u003e3.11 Files, Sockets, and similar Stateful Resources\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.12-todo-comments\"\u003e3.12 TODO Comments\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.13-imports-formatting\"\u003e3.13 Imports formatting\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.14-statements\"\u003e3.14 Statements\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.15-accessors\"\u003e3.15 Accessors\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.16-naming\"\u003e3.16 Naming\u003c/a\u003e\n          \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#s3.16.1-names-to-avoid\"\u003e3.16.1 Names to Avoid\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.16.2-naming-conventions\"\u003e3.16.2 Naming Conventions\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.16.3-file-naming\"\u003e3.16.3 File Naming\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.16.4-guidelines-derived-from-guidos-recommendations\"\u003e3.16.4 Guidelines derived from Guido’s Recommendations\u003c/a\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.17-main\"\u003e3.17 Main\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.18-function-length\"\u003e3.18 Function length\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#s3.19-type-annotations\"\u003e3.19 Type Annotations\u003c/a\u003e\n          \u003cul\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.1-general-rules\"\u003e3.19.1 General Rules\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.2-line-breaking\"\u003e3.19.2 Line Breaking\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.3-forward-declarations\"\u003e3.19.3 Forward Declarations\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.4-default-values\"\u003e3.19.4 Default Values\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.5-nonetype\"\u003e3.19.5 NoneType\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.6-type-aliases\"\u003e3.19.6 Type Aliases\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.7-ignoring-types\"\u003e3.19.7 Ignoring Types\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.8-typing-variables\"\u003e3.19.8 Typing Variables\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.9-tuples-vs-lists\"\u003e3.19.9 Tuples vs Lists\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.10-typevars\"\u003e3.19.10 Type variables\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.11-string-types\"\u003e3.19.11 String types\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.12-imports-for-typing\"\u003e3.19.12 Imports For Typing\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.13-conditional-imports\"\u003e3.19.13 Conditional Imports\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.14-circular-dependencies\"\u003e3.19.14 Circular Dependencies\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.15-generics\"\u003e3.19.15 Generics\u003c/a\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ca href=\"#s3.19.16-build-dependencies\"\u003e3.19.16 Build Dependencies\u003c/a\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#4-parting-words\"\u003e4 Parting Words\u003c/a\u003e\u003c/li\u003e --\u003e\n  \u003c/ul\u003e\n\n\u003c/details\u003e\n\n\u003c!-- \u003e Dans ce cour et tous les autres cours à venir, si le symbole `~$` se trouve\n\u003e au début d'un block de code, cela signifie qu'il s'agit de lignes de commande\n\u003e qu'on peut exécuter dans un terminal.--\u003e\n\n## 1 Contexte\nPython est le principal langage dynamique utilisé chez Google. Ce guide de\nstyle est une liste de choses à faire et à ne pas faire pour les programmes\nPython.\u003cbr/\u003e\nPour vous aider à formater le code correctement, nous avons créé un fichier de\n[configuration pour Vim](https://google.github.io/styleguide/google_python_style.vim).\nPour Emacs, les paramètres par défaut devraient convenir.\u003cbr/\u003e\nDe nombreuses équipes utilisent l'auto-formateur de\n[Black](https://github.com/psf/black) ou\n[Pyink](https://github.com/google/pyink) pour éviter de se disputer\nsur le formatage.\n\n## 2 Règle du langage Python\n### 2.1 Lint\nExécutez `pylint` sur votre code en utilisant ce\n[pylintrc](https://google.github.io/styleguide/pylintrc).\n\n#### 2.1.1 Définition\n`pylint` est un outil permettant de trouver des bugs et des problèmes de style\ndans le code source Python. Il trouve des problèmes qui sont typiquement\ndétectés par un compilateur pour des langages moins dynamiques comme C et C++.\nEn raison de la nature dynamique de Python, certains avertissements peuvent\nêtre incorrects; cependant, les avertissements erronés devraient être assez\nrares.\n\n#### 2.1.2 Avantage\nIl détecte les erreurs faciles à éviter, comme les fautes de frappe,\nl'utilisation de variables avant l'affectation, etc.\n\n#### 2.1.3 Conséquence\n`pylint` n'est pas parfait. Pour en tirer parti, nous devrons parfois écrire\nautour de lui, supprimer ses avertissements ou le corriger.\n\n#### 2.1.4 Décision\nAssurez-vous d'exécuter `pylint` sur votre code.\nSupprimez les avertissements s'ils sont inappropriés afin que d'autres\nproblèmes ne soient pas cachés. Pour supprimer les avertissements, vous pouvez\ndéfinir un commentaire au niveau de la ligne:\n\n###### `\u003c/\u003e PYTHON [01]`\n```python\ndef do_PUT(self):  # WSGI name, so pylint: disable=invalid-name\n  # ...\n\n```\n\nLes avertissements `pylint` sont chacun identifiés par un nom symbolique\n(`empty-docstring`). Les avertissements spécifiques à Google commencent\npar `g-`.\u003cbr/\u003e\n\nSi la raison de la suppression n'est pas claire à partir du nom symbolique,\najoute une explication.\nLa suppression de cette manière a l'avantage que nous pouvons facilement\nrechercher les suppressions et les revoir. Tu peux obtenir une liste des\navertissements de `pylint` en faisant :\n\n###### `\u003e_ cmd@01:~$`\n```sh\n# ~$\npylint --list-msgs\n```\n\nPour obtenir plus d'informations sur un message particulier, utilise :\n\n###### `\u003e_ cmd@02:~$`\n```sh\npylint --help-msg=invalid-name\n```\n\nIl faut plutôt utiliser `pylint: disable` au lieu d'utiliser l'ancienne forme\ndépréciée `pylint: disable-msg`.\n\nLes avertissements concernant les arguments inutilisés peuvent être supprimés\nen supprimant les variables au début de la fonction. Il faut  toujours inclure\nun commentaire expliquant pourquoi tu les supprime. \"Unused.\" est suffisant.\nPar exemple :\n\n###### `\u003c/\u003e PYTHON [02]`\n```python\ndef viking_cafe_order(spam: str, beans: str, eggs: str | None = None) -\u003e str:\n    del beans, eggs  # Unused by vikings.\n    return spam + spam + spam\n\n```\n\nAu fait, s'il y a des arguments d'une fonction que tu n'utilise pas, `pylint`\nte mettra des avertissements.\u003cbr/\u003e\n\nD'autres formes courantes de suppression de cet avertissement consistent\nà utiliser '_' comme identifiant pour l'argument inutilisé ou à préfixer\nle nom de l'argument avec 'unused_', ou à les assigner à '_'. Par exemple :\n\n###### `\u003c/\u003e PYTHON [03]`\n```python\ndef viking_cafe_order(\n  spam: str,\n  _beans: str,\n  unused_eggs: str | None = None\n) -\u003e str:\n  # ...\n\n```\n\n\nCes formes sont autorisées mais ne sont plus encouragées. Elles brisent\nles appelants qui passent les arguments par leur nom et n'imposent pas que\nles arguments soient réellement inutilisés.\nElles empêchent l'utilisateur de la fonction de passer les arguments par leur\nnom, comme `viking_cafe_order(spam=\"myspam\", beans=\"ok\", eggs=None)`\net ne spécifie pas à l'utilisateur de la fonction que ces paramètres ne sont\nplus utilisés.\n\n### 2.2 Importations\nUtilisez l'instruction `import` uniquement pour importer les paquets et les\nmodules, et non pour importer les classes ou les fonctions de façon\nindividuelles.\n\n#### 2.2.1 Définition\nMécanisme de réutilisation de code d'un module dans une autre.\n\n#### 2.2.2 Avantage\nLa convention de gestion des espaces de noms est simple. La source de chaque\nidentifiant est indiquée de manière cohérente; `x.Obj` indique que l'objet\n`Obj` est défini dans le module `x`.\n\n#### 2.2.3 Conséquences\nLes noms de modules peuvent toujours entrer en collision. Certains noms de\nmodules sont trop longs pour être utilisés. \u003c!--A expliquer --\u003e\n\n#### 2.2.4 Décision\n- Utilise `import x` pour importer des paquets et des modules.\n- Utilise `from x import y` où `x` est le préfixe du paquetage et `y` est le\nnom du module sans préfixe. Tu sais déjà programmer en python donc pas besoin\nde t'expliquer.\n- Utilise `from x import y as z` si deux modules nommés `y` doivent être\nimportés, si `y` entre en conflit avec un nom de premier niveau défini\ndans le module actuel, ou si `y` est un nom trop long pour être utilisé.\n- Utilise `import y as z` uniquement lorsque `z` est une abréviation standard\n(par exemple, `np` pour `numpy`).\n\nPar exemple, le module sound.effects.echo peut être importé comme suit :\n\n###### `\u003c/\u003e PYTHON [04]`\n```python\nfrom sound.effects import echo\n\n# ...\n\necho.EchoFilter(input, output, delay=0.7, atten=4)\n```\n\nN'utilise pas de noms relatifs dans les importations. Même si le module\nse trouve dans le même paquet, utilise le nom complet du paquet.\nCela permet d'éviter d'importer involontairement un paquet deux fois.\n\u003c!-- a expliquer --\u003e\n\n##### 2.2.4.1 Exceptions\nExceptions à cette règle:\n\u003cul\u003e \n  \u003cli\u003eLes symboles des modules suivants sont utilisés pour soutenir l'analyse\n  statique et la vérification des types:\n    \u003cul\u003e\n      \u003cli\u003e\u003ca href=\"#\"\u003eLe module typing\u003c/a\u003e\u003c/li\u003e\n      \u003cli\u003e\u003ca href=\"#\"\u003eLe module collections.abc\u003c/a\u003e\u003c/li\u003e\n      \u003cli\u003e\u003ca href=\"#\"\u003eLe module typing_extensions\u003c/a\u003e\u003c/li\u003e\n    \u003c/ul\u003e\n  \u003c/li\u003e\n  \u003cli\u003eRedirection vers le \u003ca href=\"#\"\u003emodule `typing_extensions`\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n### 2.3 Les paquets\nImporte chaque module en utilisant le chemin d'accès complet du module.\n\n### 2.3.1 Avantages\nPermet d'éviter les conflits dans les noms de modules ou les importations\nincorrectes dues au fait que le chemin de recherche des modules ne correspond\npas à ce que l'auteur attendait. Facilite la recherche de modules.\n\u003c!-- TODO: A détailler --\u003e\n\n### 2.3.2 Conséquence\nRend le déployement du code plus difficile parce qu'il faut reproduire la\nhiérarchie des paquets. Mais grâce aux mécanismes modernes de déploiement,\nce n'est plus un problème.\n\n### 2.3.3 Décision\nTout nouveau code doit importer chaque module par son nom complet.\nLes importations doivent être comme suite :\n\n###### `\u003c/\u003e PYTHON [05]`\n```python\n# CODE CORRECT:\n# Faire référence à absl.flags dans le code avec le nom complet (verbose).\nimport absl.flags\nfrom doctor.who import jodie\n\n_FOO = absl.flags.DEFINE_string(...)\n\n```\nOu, encore le code suivant:\n\n###### `\u003c/\u003e PYTHON [06]`\n```python\n# CODE CORRECT:\n# Référencer `flags` dans le code avec seulement le nom du module (commun).\nfrom absl import flags\nfrom doctor.who import jodie\n\n_FOO = flags.DEFINE_string(...)\n\n```\n\n*(en supposant que ce fichier de code suivant se trouve dans `doctor/who/` où\n  `jodie.py` se trouve également)*\nL'importation dans le code source suivant n'est pas correcte.\n\n###### `\u003c/\u003e PYTHON [07]`\n```python\n# CODE PAS CORRECT:\n# On ne sait pas exactement quel module l'auteur veut et ce qui sera importé.\n# Le comportement réel de l'importation dépend de facteurs externes contrôlant\n# sys.path. Quel module possible de jodie l'auteur voulait-il importer ?\nimport jodie\n\n```\n\nLe répertoire dans lequel se trouve le binaire principal ne doit pas être\nconsidéré comme se trouvant dans `sys.path`, même si c'est le cas dans\ncertains environnements. Pour cela, le programmeur doit supposer que\n`import jodie` fait référence à un module tiers ou de premier niveau nommé\n`jodie`, et non à un fichier local `jodie.py`.\n\n\n### 2.4 Les exceptions\nDes exceptions sont autorisées mais doivent être utilisées avec précaution.\n\n#### 2.4.1 Définition\nLes exceptions permettent de stopper le flux de contrôle normal, c'est à dire\nde l'exécution normale, pour gérer des erreurs ou d'autres conditions\nexceptionnelles.\n\n#### 2.4.2 Avantage\nLe flux de contrôle du code de fonctionnement normal n'est pas encombré par\nle code de traitement des erreurs. Il permet également au flux de contrôle\nde sauter plusieurs cadres lorsqu'une certaine condition se produit,\npar exemple en revenant de N fonctions imbriquées en une seule étape au lieu\nde devoir passer par les codes probablement truffé d'erreur.\n\n#### 2.4.3 Conséquence\nPeut rendre le flux de contrôle confus. Il est facile de manquer des cas\nd'erreur lors des appels à la bibliothèque. \u003c!-- TODO: a expliquer --\u003e\n\n#### 2.4.4 Décision\nLes exceptions doivent respecter certaines conditions :\n\n1. Utilisez les classes d'exception intégrées lorsque cela s'avère utile.\nPar exemple, levez une `ValueError` pour signaler une erreur de programmation,\ncomme une condition préalable non respectée (par exemple, si l'on vous a\ntransmis un nombre négatif alors que vous aviez besoin d'un nombre positif).\nN'utilisez pas les instructions `assert` pour valider les valeurs des\narguments d'une **API publique**. `assert` est utilisé pour garantir la\ncorrection interne, et non pour imposer une utilisation correcte ou pour\nindiquer qu'un événement inattendu s'est produit. Si une exception est\nsouhaitée dans ces derniers cas, utilisez une instruction raise. Par exemple :\n\n###### `\u003c/\u003e PYTHON [08]`\n```python\n# CODE CORRECTE:\ndef connect_to_next_port(self, minimum: int) -\u003e int:\n  \"\"\"Connects to the next available port.\n\n  Args:\n    minimum: A port value greater or equal to 1024.\n\n  Returns:\n    The new minimum port.\n\n  Raises:\n    ConnectionError: If no available port is found.\n  \"\"\"\n  if minimum \u003c 1024:\n    # Notez que cette levée de ValueError n'est pas mentionnée dans la \n    # section \"Raises :\" de la doc\n    # dans la section \"Raises :\" de la doc car il n'est pas approprié de\n    # garantir cette réaction comportementale spécifique à une mauvaise\n    # utilisation de l'API.\n    raise ValueError(f'Min. port must be at least 1024, not {minimum}.')\n\n  port = self._find_next_open_port(minimum)\n  if port is None:\n    raise ConnectionError(\n        f'Could not connect to service on port {minimum} or higher.')\n\n  assert port \u003e= minimum, (\n      f'Unexpected port {port} when minimum was {minimum}.')\n  return port\n\n```\n\n###### `\u003c/\u003e PYTHON [09]`\n```python\n# CODE PAS CORRECTE:\ndef connect_to_next_port(self, minimum: int) -\u003e int:\n  \"\"\"Connects to the next available port.\n\n  Args:\n    minimum: A port value greater or equal to 1024.\n\n  Returns:\n    The new minimum port.\n  \"\"\"\n  assert minimum \u003e= 1024, 'Minimum port must be at least 1024.'\n  port = self._find_next_open_port(minimum)\n  assert port is not None\n  return port\n\n```\n\n2. Les bibliothèques ou les paquets peuvent définir leurs propres exceptions.\nDans ce cas, ils doivent hériter d'une classe d'exception existante.\nLes noms des exceptions doivent se terminer par `Error` et ne doivent pas\nintroduire de répétition (`foo.FooError`).\n\n3. N'utilisez jamais d'instructions catch-all `except` : ou catch `Exception`\nou `StandardError`, à moins d'être :\n- en soulevant à nouveau l'exception, ou\n- la création d'un point d'isolation dans le programme où les exceptions ne\nsont pas propagées mais enregistrées et supprimées, comme la protection\nd'un thread contre le plantage en gardant son bloc le plus externe.\n\n**Python** est très tolérant à cet égard et except : attrape tout, y compris\nles noms mal orthographiés, les appels à sys.exit(), les interruptions Ctrl+C,\nles échecs d'unittest et toutes sortes d'autres exceptions que vous ne voulez\ntout simplement pas attraper.\n\n4. Minimisez la quantité de code dans un bloc `try`/`except`. Plus le corps\nde `try` est important, plus il est probable qu'une exception soit soulevée\npar une ligne de code à laquelle vous ne vous attendiez pas. Dans ce cas,\nle bloc `try`/`except` cache une véritable erreur.\n\n5. Utilisez la clause `finally` pour exécuter le code, qu'une exception\nsoit été levée ou non dans le bloc `try`. Cela est souvent utile pour le\nnettoyage, par exemple la fermeture d'un fichier.\n\n\n### 2.5 État global mutable\nÉviter les états globaux mutables.\n\n#### 2.5.1 Définition\nValeurs au niveau du module ou attributs de classe qui peuvent être modifiés\nau cours de l'exécution du programme.\n\n#### 2.5.2 Avantage\nOccasionnellement utile.\n\n#### 2.5.3 Conséquence\n- Casse l'encapsulation : Une telle conception peut rendre difficile la\nréalisation d'objectifs valables. Par exemple, si l'état global est utilisé\npour gérer la connexion à une base de données, il devient difficile de se\nconnecter à deux bases de données différentes en même temps (par exemple pour\ncalculer les différences lors d'une migration). Des problèmes similaires se\nposent facilement avec les registres globaux.\n\n- Peut modifier le comportement du module pendant l'importation, car les\naffectations aux variables globales sont effectuées lorsque le module est\nimporté pour la première fois.\n\n#### 2.5.4 Décision\nÉviter les états globaux mutables.\n\nDans les rares cas où l'utilisation d'un état global est justifiée,\nles entités globales mutables doivent être déclarées au niveau du module ou en\ntant qu'attribut de classe et rendues internes en ajoutant un `_` au nom.\nSi nécessaire, l'accès externe à l'état global mutable doit se faire par le\nbiais de fonctions publiques ou de méthodes de classe. Voir la section\n[\"Nommage\"]() ci-dessous. Veuillez expliquer les raisons pour lesquelles\nl'état global mutable est utilisé dans un commentaire ou dans un document\nlié à un commentaire.\n\nLes constantes au niveau du module sont autorisées et encouragées.\nPar exemple : `_MAX_HOLY_HANDGRENADE_COUNT = 3` pour une constante\nd'utilisation interne ou `SIR_LANCELOTS_FAVORITE_COLOR = \"blue\"` pour une\nconstante de l'API publique. Les constantes doivent être nommées en utilisant\ndes majuscules et des traits de soulignement. Voir la section\n[\"Nommage\"]() ci-dessous.\n\n\n### 2.6 Classes et fonctions imbriquées/locales/intérieures\nLes fonctions ou classes locales imbriquées sont acceptables lorsqu'elles sont\nutilisées pour fermer une variable locale. Les classes internes sont\nacceptables.\n\n#### 2.6.1 Définition\nUne classe peut être définie à l'intérieur d'une méthode, d'une fonction ou\nd'une classe. Une fonction peut être définie à l'intérieur d'une méthode ou\nd'une fonction. Les fonctions imbriquées ont un accès en lecture seule aux\nvariables définies dans les champs d'application qui les entourent.\n\n#### 2.6.2 Avantages\nPermet de définir des classes et des fonctions utilitaires qui ne sont\nutilisées que dans une portée très limitée. Couramment utilisé pour la mise\nen œuvre de décorateurs.\n\n#### 2.6.3 Conséquence\nLes fonctions et classes imbriquées ne peuvent pas être testées directement.\nL'imbrication peut rendre la fonction extérieure plus longue et moins lisible.\n\n#### 2.6.4 Décision\nLes fonctions imbriquées sont très bien avec quelques mises en garde.\nÉviter les fonctions ou classes imbriquées, sauf pour fermer une valeur locale\nautre que `self` ou `cls`. Ne pas imbriquer une fonction simplement pour la\ncacher aux utilisateurs d'un module. Au lieu de cela, préfixez son nom par\nun `_` au niveau du module afin qu'il soit toujours accessible par les tests.\n\n\n### 2.7 Comprehensions \u0026 Expressions de Generator\nC'est bon à utiliser pour des cas simples.\n\n#### 2.7.1 Définition\nLes compréhensions `list`, `dict` et `set` ainsi que les expressions\ngénératrices constituent un moyen concis et efficace de créer des types de\nconteneurs et des itérateurs sans avoir recours aux boucles traditionnelles,\naux `map()`, aux `filter()` ou aux `lambda`.\n\n#### 2.7.2 Avantages\nLes compréhensions simples peuvent être plus claires et plus simples que\nd'autres techniques de création de `dict`, de `list` ou `set`. Les expressions\ngénératrices peuvent être très efficaces, puisqu'elles évitent la création\nd'une liste entièrement.\n\n#### 2.7.3 Conséquence\nLes compréhensions compliquées ou les expressions génératrices peuvent être\n**difficiles à lire**.\n\n#### 2.7.4 Décision\nBon pour être utilisé pour des cas simples. Chaque portion doit tenir\nsur une ligne : *mapping expression*, clause `for`, expression `filter`.\nLes multiples clause `for` ou expression `filter` ne sont pas permits.\nUtilisez plutôt des boucles lorsque les choses deviennent plus compliquées.\n\n###### `\u003c/\u003e PYTHON [10]`\n```python\n# CODE CORRECT:\nresult = [mapping_expr for value in iterable if filter_expr]\n\nresult = [{'key': value} for value in iterable\n          if a_long_filter_expression(value)]\n\nresult = [complicated_transform(x)\n          for x in iterable if predicate(x)]\n\ndescriptive_name = [\n    transform({'key': key, 'value': value}, color='black')\n    for key, value in generate_iterable(some_input)\n    if complicated_condition_is_met(key, value)\n]\n\nresult = []\nfor x in range(10):\n    for y in range(5):\n        if x * y \u003e 10:\n            result.append((x, y))\n\nreturn {x: complicated_transform(x)\n        for x in long_generator_function(parameter)\n        if x is not None}\n\nsquares_generator = (x**2 for x in range(10))\n\nunique_names = {user.name for user in users if user is not None}\n\neat(jelly_bean for jelly_bean in jelly_beans\n    if jelly_bean.color == 'black')\n\n```\n\n###### `\u003c/\u003e PYTHON [11]`\n```python\nCODE PAS CORRECT:\n  result = [complicated_transform(\n                x, some_argument=x+1)\n            for x in iterable if predicate(x)]\n\n  result = [(x, y) for x in range(10) for y in range(5) if x * y \u003e 10]\n\n  return ((x, y, z)\n          for x in range(5)\n          for y in range(5)\n          if x != y\n          for z in range(5)\n          if y != z)\n\n```\n\n\n### 2.8 Itérateurs et opérateurs par défaut\nUtilisez des itérateurs et des opérateurs par défaut pour les types qui les\nprennent en charge, comme les listes, les dictionnaires et les fichiers.\n\n\n#### 2.8.1 Définition\nLes types de conteneurs, comme les dictionnaires et les listes, définissent\ndes itérateurs par défaut et des opérateurs de test d'appartenance\n(\"in\" et \"not in\").\n\n\n#### 2.8.2 Avantages\nLes itérateurs et opérateurs par défaut sont simples et efficaces.\nIls expriment l'opération directement, sans appel de méthode supplémentaire.\nUne fonction qui utilise des opérateurs par défaut est générique.\nElle peut être utilisée avec n'importe quel type prenant en charge l'opération.\n\n\n#### 2.8.3 Conséquences\nIl est impossible de connaître le type d'un objet en lisant le nom\ndes méthodes (à moins que la variable ne comporte des annotations de type).\nMais cela peut être également un avantage.\n\n\n#### 2.8.4 Solutions\nUtilise les itérateurs et les opérateurs par défaut pour les types qui\nles prennent en charge, comme les listes, les dictionnaires et les fichiers.\nLes types intégrés définissent également des méthodes d'itérateur. Il faut\npréférer ces méthodes à celles qui renvoient des listes, sauf que tu\nne dois pas modifier un conteneur pendant que tu le parcour.\n\n###### `\u003c/\u003e PYTHON [12]`\n```python\n# CODE CORRECTE:\nfor key in adict: ...\nif obj in alist: ...\nfor line in afile: ...\nfor k, v in adict.items(): ...\n\n```\n\n```python\n# CODE PAS CORRECTE:\nfor key in adict.keys(): ...\nfor line in afile.readlines(): ...\n\n```\n\n\n### 2.9 Générateurs\nUtiliser des générateurs si nécessaire.\n\n#### 2.9.1 Définition\nUne fonction generator renvoie un itérateur qui produit une valeur chaque fois\nqu'il exécute une instruction `yield`. Après avoir produit une valeur, l'état\nd'exécution de la fonction generator est suspendu jusqu'à ce que la valeur\nsuivante soit demandée.\n\n#### 2.9.2 Avantages\nCode plus simple, car l'état des variables locales et le flux de contrôle\nsont préservés à chaque appel. Un générateur utilise moins de mémoire\nqu'une fonction qui crée une liste entière de valeurs en une seule fois.\n\n#### 2.9.3 Conséquences\nLes variables locales du générateur ne seront pas libérées jusqu'à ce que le\ngénérateur soit consommé jusqu'à épuisement ou qu'il soit lui-même libéré de\nla mémoire.\n\n#### 2.9.4 Solutions\n1. Il est recommendé d'utilisez `\"Yields :\"` plutôt que `\"Returns :\"`\ndans la docstring des fonctions de type générateur.\n\n2. Si le générateur gère une ressource coûteuse, assure toi de forcer\nle nettoyage.\n\n3. Une bonne façon de faire le nettoyage est d'envelopper le générateur\navec un gestionnaire de contexte [PEP-0533](https://peps.python.org/pep-0533/).\n\n\u003c!-- https://google.github.io/styleguide/pyguide.html#210-lambda-functions --\u003e\n\n\n### 2.10 Fonction Lambda\nConvient pour les expressions d'une ligne. Préférez les expressions\ngénératrices avec un lambda que les fonction `map()` ou `filter()`.\n\n#### 2.10.1 Définition\nLes **lambdas expressions** définissent des fonctions anonymes dans une\nexpression.\n\n#### 2.10.2 Avantages\nC'est très pratique.\n\n#### 2.10.3 Conséquences\nElles sont plus difficiles à lire et à déboguer que les fonctions locales.\nL'expressivité est limitée car la fonction ne peut contenir qu'une seule\nexpression ou instruction.\n\n#### 2.10.4 Décision\nIl est possible de les utiliser pour des définitions d'une ligne d'instruction.\nSi le code à l'intérieur de la fonction lambda est plus long que 60-80\ncaractères, il est préférable de la définir comme une fonction normale.\n\nPour les opérations courantes comme la multiplication, utilisez les fonctions\ndu module operator au lieu des fonctions lambda. Par exemple, il faut\npréférer `operator.mul` à `lambda x, y : x * y`.\n\n\n### 2.11 Expressions conditionnelles\nC'est bon pour des cas de programmation simple.\n\n#### 2.11.1 Définition\nLes expressions conditionnelles (parfois appelées \"opérateurs ternaires\") sont\ndes mécanismes qui fournissent une syntaxe plus courte pour les instructions\n`if`. Par exemple : `x = 1 if condition else 2`.\n\n#### 2.11.2 Avantages\nPlus court et plus pratique qu'une instruction `if` complet.\n\n#### 2.11.3 Conséquences\nLa condition peut être difficile à localiser ou à percevoir si l'expression\nest longue.\n\n#### 2.11.4\nUtilisable pour les cas simples. Chaque partie doit tenir sur une ligne :\nexpression_planA,if condition else expression_plan_B. Il faut utiliser une\ninstruction `if` complète lorsque les choses deviennent plus complexe.\n\n###### `\u003c/\u003e PYTHON [13]`\n```python\n# CODE CORRECTE:\none_line = 'yes' if predicate(value) else 'no'\nslightly_split = ('yes' if predicate(value) else 'no, nein, nyet')\nthe_longest_ternary_style_that_can_be_done = (\n        'yes, true, affirmative, confirmed, correct' if predicate(value)\n        else 'no, false, negative, nay'\n)\n\n```\n\n###### `\u003c/\u003e PYTHON [14]`\n```python\n# CODE PAS CORRECT:\nbad_line_breaking = ('yes' if predicate(value) else 'no')\nportion_too_long = (\n  'yes' if some_long_module.some_long_predicate_function(\n    really_long_variable_name\n  )\n  else 'no, false, negative, nay'\n)\n\n```\n\n\u003c!-- https://google.github.io/styleguide/pyguide.html#212-default-argument-values --\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoditheck%2Fgoogle_python_style","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoditheck%2Fgoogle_python_style","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoditheck%2Fgoogle_python_style/lists"}