557 votes

' le module ' ou ' de l’importation du module '

J’ai essayé de trouver un guide complet sur la question de savoir si il est préférable d’utiliser ou . Je viens de commencer avec Python, avec l’intention pour le développement d’applications web avec Django et je suis en train de commencer avec les meilleures pratiques à l’esprit.

Fondamentalement, j’espérais que si quelqu'un pouvait partager leurs expériences, quelles préférences ont d’autres développeurs et quel est le meilleur moyen d’éviter les pièges sur la route.

588voto

Mark Roddy Points 7568

La différence entre import module et from module import foo est essentiellement subjective. Choisir celui que vous aimez le mieux et d'être cohérent dans votre utilisation. Voici quelques points pour vous aider à décider.

import module

  • Pour:
    • Moins d'entretien de votre import des déclarations. N'avez pas besoin d'ajouter des importations de commencer à utiliser un autre élément du module
  • Inconvénients:
    • En tapant module.foo dans votre code peut être fastidieux et redondant (l'ennui peut être minimisée par l'utilisation import module as mo puis en tapant mo.foo)

from module import foo

  • Pour:
    • Moins de frappe à utiliser foo
    • Plus de contrôle sur les éléments d'un module peut être consulté
  • Inconvénients:
    • L'utilisation d'un nouvel élément dans le module, vous devez mettre à jour votre import déclaration
    • Vous perdez le contexte de foo. Par exemple, il est moins clair qu' ceil() t par rapport à l' math.ceil()

La méthode est acceptable, mais ne pas utiliser from module import *.

Pour toute raisonnable ensemble de code, si vous import * vous sera probablement de cimentation dans le module, incapable d'être supprimé. C'est parce qu'il est difficile de déterminer quels sont les éléments utilisés dans le code sont à venir à partir de "module", il est facile de se rendre à l'endroit où vous pensez que vous n'utilisez pas l' import , pas plus, mais il est extrêmement difficile d'être sûr.

247voto

Il y a un autre détail ici, ne sont pas mentionnés, lié à l'écriture d'un module. Accordé cela peut ne pas être très commun, mais j'ai besoin de temps à autre.

En raison de la façon dont les références et le nom de la liaison fonctionne en Python, si vous voulez mettre à jour un certain symbole dans un module, dire foo.bar, à partir de l'extérieur de ce module, et d'autres de l'importation de code de "voir" que le changement, vous devez importer les foo d'une certaine manière. Par exemple:

module foo:

bar = "apples"

module a:

import foo
foo.bar = "oranges"   # update bar inside foo module object

module b:

import foo           
print foo.bar        # if executed after a's "foo.bar" assignment, will print "oranges"

Toutefois, si vous importez les noms de symboles à la place des noms de module, cela ne fonctionnera pas.

Par exemple, si je fais cela dans un module:

from foo import bar
bar = "oranges"

Pas de code à l'extérieur d'un verrez le bar "les oranges" parce que mon réglage de la barre de simplement touché le nom "bar" à l'intérieur d'un module, il n'a pas "atteindre" les foo module objet et de mettre à jour son "bar".

43voto

dwc Points 12676

Les deux façons sont pris en charge pour une raison: il y a des moments où l'on est plus appropriée que les autres.

le module d'importation: nice lorsque vous utilisez le nombre de bits du module. inconvénient est que vous aurez besoin pour bénéficier chaque référence avec le nom du module.

dans le module d'importation ...: nice que des articles importés sont utilisables directement sans module de préfixe de nom. inconvénient est que vous devez une liste de chaque chose que vous utilisez, et qu'il n'est pas clair dans le code où quelque chose est venu.

Qui dépend rend le code clair et lisible, et a plus que peu à voir avec la préférence personnelle. Je me penche vers import module généralement parce que dans le code il est très clair où un objet ou une fonction est venu. J'utilise from module import ... quand je suis à l'aide d'un objet/fonction d'un lot dans le code.

35voto

Stefano Borini Points 36904

Personnellement, j'ai toujours utiliser

from package.subpackage.subsubpackage import module

et puis d'accéder à tout ce que

module.function
module.modulevar

etc. La raison en est que, dans le même temps, vous avez de courte invocation, et vous de définir clairement le module de l'espace de noms de chaque routine, quelque chose qui est très utile si vous avez à la recherche pour l'utilisation d'un module dans votre source.

Il va sans dire, ne pas utiliser l'import *, parce qu'il pollue votre espace de noms et de ne pas vous dire où est une fonction donnée vient (à partir du module)

Bien sûr, vous pouvez exécuter dans le pétrin si vous avez le même nom de module pour les deux modules différents dans deux packages différents, à l'instar de

from package1.subpackage import module
from package2.subpackage import module

dans ce cas, vous devez bien entendu avoir des problèmes, mais il y a un fort soupçon que votre package de mise en page est erronée, et que vous avez à le repenser.

16voto

Andrew Hare Points 159332
<pre><code></code><p>Est préférable lorsque vous utiliserez des nombreuses fonctions du module.</p><pre><code></code></pre><p><code></code>.</p></pre>

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