Python * les importations de

on m'a généralement dit que ce qui suit est une mauvaise pratique.

from module import *

le raisonnement principal (du moins c'est ce qu'on m'a dit), est que vous pourriez éventuellement importer quelque chose que vous ne vouliez pas, et que cela pourrait masquer une fonction ou une classe du même nom à partir d'un autre module.

Toutefois, ce sujet de PyQt

from PyQt4.QtCore import *

chaque exemple que j'ai vu est écrit de cette façon, principalement parce que tout ce qui est exporté de Qt commence par "Q", donc il ne va pas suivre quoi que ce soit.

Quel est le consensus? Est-il toujours mauvais à utiliser * importations?

EDIT:

juste pour être clair, cette question concerne spécifiquement L'utilisation de PyQt4. Cela n'a rien à voir avec la façon dont je conçois un autre projet.

fondamentalement, j'ai trouvé que le codage à PEP8 a amélioré ma lisibilité de code,sauf en ce qui concerne L'importation de PyQt4, et donc j'ai ignoré les critiques des puristes jusqu'à maintenant. Mais maintenant mon groupe de dev se prononce sur une convention et je me demande s'il s'agit d'un scénario "où la praticité bat la pureté", ou si je devrais juste l'aspirer et faire face à des importations monstrueuses de PyQt4

from PyQt4.QtGui import QComboBox, QLineEdit, QLayout, Q;lakdfaf.......
12
demandé sur CharlesB 2011-05-04 04:25:29

8 réponses

cela peut en quelque sorte se transformer en guerre religieuse. C'est une question de savoir si vous voulez être expresse ou si vous voulez éviter d'être trop verbeux. En général, à la suite de l' Zen de Python, il est préférable d'être explicite, mais parfois les gens ne trouvent tout simplement pas pratique d'énumérer chaque importation à partir d'un module particulier.

9
répondu arussell84 2011-05-04 00:30:53

ma règle générale est que si je n'ai pas écrit le module, Je n'importe pas tout. Ma plus grande crainte est en fait d'écrire des variables locales qui auraient pu être définies dans le module importé. Donc pour éviter d'avoir à taper des noms de modules longs, j'utilise l'import comme fonctionnalité. En utilisant votre module comme exemple, je ferais ce qui suit:

import PyQt4.QtCore as qt

cela étant dit, j'ai beaucoup de modules de soutien que j'écris et que je vais tout importer. Comme le module pyqt, je les nomme par un nom descriptif qui aide à montrer de quel module il provient.

Modifier par commentaire

Quand j'utilise import*, mes modules de support ne contiennent pas de classes ou quoi que ce soit qui puisse créer une nouvelle instance. Ils tendent à être des groupes de fonctions qui modifient uniquement les instances existantes. Pour clarifier mon opinion: si je suis le propriétaire du code source et que je serai le responsable principal, j'utiliserai l'import* sinon j'utiliserai l'import as.

une Autre la raison pour laquelle j'utilise l'import comme fonctionnalité est de me permettre de simuler des modules à des fins de débogage. Dans un projet sur lequel je travaille actuellement, j'utilise pyVisa pour parler à un certain nombre d'appareils GPIB. Lorsque je ne suis pas connecté au réseau GPIB des périphériques, je peux utiliser un module dummy_visa pour écrire au stdout (pour vérifier que j'envoie le bon format) et retourner un nombre aléatoire (pour tester mon application). Voir ci-dessous

if visa_debug:
    import dummy_visa as visa
else:
    import visa
gpib = visa.Instrument("GPIB0::10")
gpib.write("MEAS:VOLT?")
5
répondu Adam Lewis 2011-05-04 01:53:11

faire une exception explicite pour les modules qui incluent déjà un namespace dans leur convention de nommage (comme Q* de PyQT) est parfaitement raisonnable. Cependant, je recommande d'être clair sur le fait que la valeur par défaut est toujours "ne pas l'utiliser" et de simplement énumérer cette exception dans vos directives de codage.

import * est également acceptable lorsqu'il est utilisé comme un truc de manipulation d'espace de noms dans une application (les deux formes que je connais sont des modules d'accélération c optionnels qui sont importés à la fin de la version Python pure, et "aplatir" un espace de noms de paquet dans