71 votes

Quelles sont les bonnes règles à suivre pour les importations Python ?

Je suis un peu confus par la multitude de façons dont on peut importer des modules dans Python.

import X
import X as Y
from A import B

Je me suis renseigné sur le scoping et les espaces de noms, mais j'aimerais avoir des conseils pratiques sur la meilleure stratégie à adopter, dans quelles circonstances et pourquoi. Les importations doivent-elles se faire au niveau du module ou de la méthode/fonction ? Dans le __init__.py ou dans le code du module lui-même ?

Ma question ne trouve pas vraiment de réponse dans " Paquets Python - importation par classe et non par fichier ", bien qu'elle soit manifestement liée.

65voto

DzinX Points 13452

Dans le code de production de notre société, nous essayons de suivre les règles suivantes.

Nous plaçons les importations au début du fichier, juste après la docstring du fichier principal, par exemple :

"""
Registry related functionality.
"""
import wx
# ...

Maintenant, si nous importons une classe qui est l'une des rares dans le module importé, nous importons le nom directement, de sorte que dans le code nous devons seulement utiliser la dernière partie, par exemple :

from RegistryController import RegistryController
from ui.windows.lists import ListCtrl, DynamicListCtrl

Il existe cependant des modules qui contiennent des dizaines de classes, par exemple la liste de toutes les exceptions possibles. Ensuite, on importe le module lui-même et on y fait référence dans le code :

from main.core import Exceptions
# ...
raise Exceptions.FileNotFound()

Nous utilisons le import X as Y aussi rarement que possible, car cela rend difficile la recherche de l'utilisation d'un module ou d'une classe particulière. Parfois, cependant, vous devez l'utiliser si vous souhaitez importer deux classes qui ont le même nom, mais qui existent dans des modules différents, par exemple :

from Queue import Queue
from main.core.MessageQueue import Queue as MessageQueue

En règle générale, nous ne faisons pas d'importations à l'intérieur des méthodes - elles rendent simplement le code plus lent et moins lisible. Certains peuvent trouver que c'est un bon moyen de résoudre facilement le problème des importations cycliques, mais une meilleure solution est la réorganisation du code.

35voto

Permettez-moi de coller une partie de la conversation sur la liste de diffusion django-dev lancée par Guido van Rossum :

[...] Par exemple, les guides de style de Google Python[1] prévoient que tous les sites Web de l'entreprise doivent être mis à jour. doivent importer un module, et non une classe ou une fonction de ce module. module. Il y a beaucoup plus de classes et de fonctions qu'il n'y a de modules. modules, donc se rappeler d'où vient une chose particulière est beaucoup plus plus facile si elle est préfixée par un nom de module. Souvent, plusieurs modules définissent des choses avec le même nom - ainsi un lecteur du code n'a pas à revenir en haut de la page. n'a pas besoin de retourner au début du fichier pour voir de quel module provient une nappe donnée. module un nom donné est importé.

Source : http://groups.google.com/group/django-developers/browse_thread/thread/78975372cdfb7d1a

1 : http://code.google.com/p/soc/wiki/PythonStyleGuide#Module_and_package_imports

12voto

user18044 Points 1567

J'utiliserais normalement import X au niveau du module. Si vous n'avez besoin que d'un seul objet d'un module, utilisez from X import Y .

N'utilisez que import X as Y au cas où vous seriez confronté à un conflit de noms.

Je n'utilise les importations au niveau des fonctions que pour importer les éléments dont j'ai besoin lorsque le module est utilisé comme module principal, par exemple :

def main():
  import sys
  if len(sys.argv) > 1:
     pass

HTH

9voto

Robert Jacobs Points 348

Quelqu'un a dit plus haut que

from X import A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P

est équivalent à

import X

import X permet des modifications directes de A-P, tandis que from X import ... crée des copies de A-P. Pour from X import A..P vous ne recevez pas les mises à jour des variables si elles sont modifiées. Si vous les modifiez, vous ne modifiez que votre copie, mais X est au courant de vos modifications.

Si A-P sont des fonctions, vous ne ferez pas la différence.

3voto

Jason Baker Points 56682

Ne faites pas ça :

from X import *

à moins que vous ne soyez absolument sûr d'utiliser chaque élément de ce module. Et même dans ce cas, vous devriez probablement reconsidérer l'utilisation d'une approche différente.

En dehors de cela, c'est juste une question de style.

from X import Y

est bon et vous évite de taper beaucoup de choses. J'ai tendance à l'utiliser lorsque j'utilise quelque chose dans ce module assez fréquemment. Mais si vous importez beaucoup de ce module, vous pouvez vous retrouver avec une déclaration d'importation qui ressemble à ceci :

from X import A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P

Vous voyez le genre. C'est alors que les importations comme

import X

deviennent utiles. Soit ça, soit je n'utilise pas vraiment les éléments de X très fréquemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X