Question

J'ai vu certains programmeurs Python utiliser le style suivant de manière assez constante (nous l'appellerons style 1):

import some_module
# Use some_module.some_identifier in various places.

Pour soutenir ce style, vous pouvez citer le " explicit est meilleur que maxime " implicite. J'ai vu d'autres programmeurs utiliser ce style (style 2):

from some_module import some_identifier
# Use some_identifier in various places.

Le principal avantage que je vois dans le style 2 est la facilité de maintenance, en particulier avec la saisie de canards . idéaux, je pourrais vouloir échanger some_module contre some_other_module. Je pense aussi que le style 2 gagne des points avec le "La lisibilité compte" . Même si j'ai tendance à être en désaccord, on peut toujours affirmer que la recherche et le remplacement constituent une option tout aussi intéressante lorsque vous utilisez le premier style.

Addendum: Il a été noté que vous pouviez utiliser comme pour résoudre le passage de some_module à some_other_module . style 1. J’ai oublié de mentionner qu’il est également courant de décider d’implémenter some_identifier dans votre module current , ce qui permet de créer un some_module équivalent conteneur légèrement délicat.

Était-ce utile?

La solution

Il y a des utilisations dans les deux cas, donc je ne pense pas que ce soit l'un ou l'autre. J'envisagerais d'utiliser le module importer x, y, z lorsque:

  • Il y a un assez petit nombre d'éléments à importer

  • Le but des fonctions importées est évident lorsqu'il est séparé du nom du module. Si les noms sont assez génériques, ils peuvent entrer en conflit avec d’autres et vous en dire peu. par exemple. voir remove ne vous dit pas grand chose, mais os.remove laissera probablement entendre que vous avez affaire à des fichiers.

  • Les noms ne se contredisent pas. Similaire à ce qui précède, mais plus important. Ne jamais faire quelque chose comme:

     from os import open
    
Le module

import [as renamed_module] présente l’avantage de donner un peu plus de contexte à ce qui est appelé lorsque vous l’utilisez. L’inconvénient est que cela est un peu plus encombré lorsque le module ne donne pas plus d’informations et qu’il est légèrement moins performant (2 recherches au lieu de 1).

Cependant, il présente également des avantages lors des tests (par exemple, le remplacement de os.open par un objet fantaisie, sans avoir à changer de module), et doit être utilisé lors de l'utilisation de modules mutables, par exemple.

import config
config.dburl = 'sqlite:///test.db'

En cas de doute, je choisirais toujours le style module d'importation .

Autres conseils

Avec l'existence de la syntaxe suivante:

import some_other_module as some_module

l'argument de maintenabilité du style 2 n'est plus pertinent.

J'ai tendance à utiliser le style 1. Normalement, je constate que le nom du package importé n'est explicitement référencé que quelques fois dans un programme Python typique. Tout le reste est constitué de méthodes sur l'objet, qui n'ont bien entendu pas besoin de référencer le package importé.

J'utilise généralement un seuil pour décider de cela. Si je veux utiliser beaucoup d'éléments dans some_module , je vais utiliser:

import some_module as sm
x = sm.whatever

S'il n'y a qu'une ou deux choses dont j'ai besoin:

from some_module import whatever
x = whatever

Cela suppose que je n'ai pas besoin d'un quelconque de some_other_module , bien sûr.

J'ai tendance à utiliser la clause comme sur les importations afin de réduire le nombre de saisies et dans un autre module très facilement à l'avenir.

Je préfère importer X , puis utiliser X.a autant que possible.

Mon exception est centrée sur les modules profondément imbriqués dans un grand framework comme Django. Leurs noms de modules ont tendance à être longs et leurs exemples disent tous à partir des paramètres d'importation django.conf pour vous éviter de saisir django.conf.settings.DEBUG partout.

Si le nom du module est profondément imbriqué, l'exception consiste à utiliser depuis X.Y.Z, importez un .

Je trouve que la notation

from some_module import some_symbol

fonctionne mieux dans la plupart des cas. De même, en cas de conflit de noms pour le symbole, vous pouvez utiliser:

from some_module import some_symbol as other_symbol

Comme l'indique la question, elle évite de réécrire le nom du module en permanence, avec à chaque fois un risque d'erreur de frappe. J'utilise la syntaxe:

import  module [as other_module]

Seulement dans deux cas:

  1. J'utilise trop de fonctions / objets de module pour tous les importer
  2. Le module définit un symbole qui peut changer pendant l'exécution

J'essaie personnellement de ne pas trop toucher à mon espace de noms, donc dans la plupart des situations, je ne fais que

import module  

ou     module d'importation en tant que mod

La seule différence réelle est quand j’ai un module avec une seule classe qui est beaucoup utilisé. Si j’avais sous-classé un type list pour y ajouter quelques fonctionnalités, j’utiliserais

from SuperImprovedListOverloadedWithFeatures import NewLIst
nl = NewList()

etc.

J'ai tendance à n'utiliser que quelques membres de chaque module, donc il y a beaucoup de

from john import cleese
from terry import jones, gilliam

dans mon code. J'importerai des modules entiers (tels que os ou wx ) si j'espère utiliser la plupart du module et si le nom du module est court. Je vais également importer des modules entiers en cas de conflit de nom ou si je souhaite rappeler au lecteur à quoi cette fonction est associée.

import michael
import sarah

import wave

gov_speech = wave.open(sarah.palin.speechfile)
parrot_sketch = wave.open(michael.palin.justresting)

(Je pourrais utiliser depuis Wave Import sous le nom wave_open , mais je pense que wave.open sera plus familier au lecteur.

Je crois aux nouvelles versions de Python (2.5+? vous devez vérifier mes faits ...), vous pouvez même le faire:

import some_other_module as some_module

Vous pouvez donc toujours utiliser le style 1 et échanger ultérieurement un autre module.

Je pense que cela correspond généralement à ce que vous voulez encombrer votre espace de noms. Voulez-vous simplement utiliser un ou deux noms dans le module? Ou tous ( de x import * n'est pas toujours mauvais, mais en général)?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top