Quelle est la bonne façon de trier les instructions Python `import x` et` from x import y`?

170

Le guide de style python suggère de regrouper les importations comme ceci:

Les importations doivent être regroupées dans l'ordre suivant:

  1. importations de bibliothèques standard
  2. importations tierces liées
  3. importations spécifiques à une application / bibliothèque locale

Cependant, il ne mentionne rien de la manière dont les deux modes d’importation devraient être présentés:

from foo import bar
import foo

Il existe plusieurs façons de les trier (supposons que toutes ces importations appartiennent au même groupe):

  • d'abord from..import, puisimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
  • d'abord import, puisfrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
  • ordre alphabétique par nom de module, en ignorant le type d'importation

    import abc
    import def
    from g import gg
    import x
    from xx import xx

PEP8 ne mentionne pas l'ordre préféré pour cela et les fonctionnalités de "nettoyage des importations" que certains IDE ont probablement juste faire ce que le développeur de cette fonctionnalité a préféré.

Je recherche un autre PEP clarifiant ceci ou un commentaire / e-mail pertinent du BDFL (ou d'un autre développeur principal de Python). Veuillez ne pas publier de réponses subjectives indiquant votre propre préférence.

ThiefMaster
la source
20
À l'utilisateur qui a voté pour fermer ceci: je ne demande pas d'avis! Veuillez lire le dernier paragraphe de ma question.
ThiefMaster
9
Je doute qu'il y ait une manière «correcte». Quel est le problème avec le choix de votre propre style à ce sujet? Il ne peut guère y avoir de convention si personne ne la connaît. Et est-ce vraiment important? Quel est l'avantage d'avoir ceci spécifié?
Steven Rumbalski
6
+1 sonne comme PEP8 devrait être étendu.
hochl
7
Une faiblesse dans un PEP ne signifie pas nécessairement qu'il doit être amendé.
Ignacio Vazquez-Abrams
2
Je divise généralement les importations en groupes logiques, puis je trie ces petits groupes par longueur de ligne ... pour la simple raison qu'ils sont plus beaux. Si vous mettez ces groupes logiques dans un ordre quelque peu logique, vous pouvez rechercher n'importe quelle importation assez rapidement (en plus du Ctrl+Ftemps constant, peu importe comment vous organisez les importations ...)
Bakuriu

Réponses:

112

Les importations sont généralement classées par ordre alphabétique et décrites à divers endroits à côté de PEP 8.

Les modules classés par ordre alphabétique sont plus rapides à lire et à rechercher . Après tout, python est une question de lisibilité. De plus, il est plus facile de vérifier que quelque chose est importé et évite les importations en double

Il n'y a rien de disponible dans PEP 8 concernant le tri, c'est donc une question de choix de ce que vous utilisez.

Selon quelques références provenant de sites et de référentiels réputés, la popularité est également un ordre alphabétique.

pour par exemple comme ceci:

import httplib
import logging
import random
import StringIO
import time
import unittest
from nova.api import openstack
from nova.auth import users
from nova.endpoint import cloud

OU

import a_standard
import b_standard

import a_third_party
import b_third_party

from a_soc import f
from a_soc import g
from b_soc import d

Le référentiel officiel de Reddit indique également qu'en général l'ordre d'importation PEP-8 doit être utilisé. Cependant, il y a quelques ajouts qui sont

for each imported group the order of imports should be:
import <package>.<module> style lines in alphabetical order
from <package>.<module> import <symbol> style in alphabetical order

Références:

PS: l' utilitaire isort trie automatiquement vos importations.

Abhishek
la source
21
Je ne vois pas où vous répondez à la question réelle…
liori
3
@liori J'ai soumis une référence / des liens pertinents indiquant comment trier les modules. Comme PEP 8 ne mentionne rien, mais beaucoup d'autres références suggèrent d'utiliser des méthodes d'importation comme celle-ci.
Abhishek
7
Notez que la question porte sur le tri import xet les from y import zdéclarations les unes par rapport aux autres. Je ne vois pas de réponse à cette question dans votre réponse. Vous reformulez essentiellement une partie de la question qui explique déjà la manière PEP8 de regrouper par type d'importation. Si une réponse à cette question spécifique se trouve dans certains des liens, veuillez citer les parties pertinentes.
liori
2
Je voudrais noter une opinion dissidente sur l’affirmation selon laquelle les déclarations d’importation triées par ordre alphabétique sont plus faciles à lire. Je les trouve beaucoup plus difficiles à lire par rapport aux instructions d'importation triées par longueur. Si vous triez lexicalement dans un groupe de longueur donné, ce serait bien et peut même être bénéfique. Mais, je trouverais import datetimesuivi par import os beaucoup plus difficile à lire que import ossuivi par import datetime. Et la différence entre les rechercher avec un tri lexical par rapport à un tri non lexical est si insignifiante qu'elle n'a aucune importance, même de quelque manière que ce soit.
ely
Quel ordre doit être utilisé pour les importations privées ou publiques? ( import _tkintervs import unittest)
Stevoisiak
30

Selon les conventions de codage internes de la CIA (qui fait partie de la fuite de WikiLeaks Vault 7 ), les importations python doivent être regroupées en trois groupes:

  1. Importations de bibliothèques standard
  2. Importations de tiers
  3. Importations spécifiques à l'application

Les importations doivent être classées lexicographiquement au sein de ces groupes, en ignorant la casse:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
gar
la source
23
Voté pour le facteur de rire que ce sont les directives de style de codage de la CIA. Très intelligent, mais en même temps pertinent compte tenu du niveau d'expertise de ces développeurs.
Tyler James Harden
5
c'est le guide de style
Marius Mucenicu
2
Lien mis à jour: Google Python Style Guide - Section 3.13: Mise en forme des importations .
Mateen Ulhaq
1
Mais cela ne suit pas de l'exemple si cela from x import ydoit être avant ou après from y import x- est-ce le nom du module ou l'importation réelle qui détermine la commande?
Niklas R.
1
Je sais que c'est une blague, mais en tant que véritable nerd, je tiens à souligner que cela vient en fait de PEP8
Marat
8

Le PEP 8 n'en dit en effet rien. Il n'y a pas de convention pour ce point, et cela ne signifie pas que la communauté Python doit en définir une absolument. Un choix peut être meilleur pour un projet mais le pire pour un autre ... C'est une question de préférences pour cela, puisque chaque solution a des avantages et des inconvénients. Mais si vous voulez suivre les conventions, vous devez respecter l'ordre principal que vous avez cité:

  1. importations de bibliothèques standard
  2. importations tierces liées
  3. importations spécifiques à une application / bibliothèque locale

Par exemple, Google recommande dans cette page que l' importation soit triée lexicographiquement , dans chaque catégorie (standard / tiers / vôtre). Mais chez Facebook, Yahoo et peu importe, c'est peut-être une autre convention ...

Maxime Lorant
la source
0

Toutes les import xinstructions doivent être triées par la valeur de xet toutes les from x import yinstructions doivent être triées par la valeur de xpar ordre alphabétique et les groupes d' from x import yinstructions triés doivent suivre le groupe d' import xinstructions trié .

import abc
import def
import x
from g import gg
from x import xx
from z import a
Astitva Srivastava
la source
0

J'ai l'impression que la réponse acceptée est un peu trop verbeuse. Voici TLDR:

Dans chaque regroupement, les importations doivent être triées lexicographiquement, en ignorant la casse, en fonction du chemin complet du package de chaque module

Guide de style de code Google

Donc, la troisième option est correcte:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
Marat
la source