web-dev-qa-db-fra.com

Faut-il éviter l'importation de caractères génériques?

J'utilise PyQt et je rencontre ce problème. Si mes déclarations d'importation sont:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

alors pylint donne des centaines d’avertissements «importation non utilisée». J'hésite à les désactiver, car il est possible que d'autres importations inutilisées soient réellement utiles. Une autre option serait de faire ceci:

from PyQt4.QtCore import Qt, QPointF, QRectF
from PyQt4.QtGui import QGraphicsItem, QGraphicsScene, ...

et je finis par avoir 9 classes sur la ligne QtGui. Il y a une troisième option, qui est:

from PyQt4 import QtCore, QtGui

puis préfixez toutes les classes avec QtCore ou QtGui chaque fois que je les utilise.

À ce stade, je suis indifférent à celui que je finis par faire dans mon projet, bien que le dernier semble le plus douloureux de mon point de vue. Quelles sont les pratiques courantes ici? Y a-t-il une raison technique d'utiliser un style plutôt qu'un autre?

40
Colin

La réponse au titre de votre question est "oui": je recommande de ne jamais utiliser from ... import * et j'ai discuté des raisons dans une autre réponse très récente. En bref, les noms qualifiés sont bien , les noms de caractères sont très limités, la "troisième option" est donc optimale (vous utiliserez des noms qualifiés, et non des noms de noms) parmi ceux que vous présentez.

(Les avantages des noms qualifiés par rapport aux noms de domaine incluent la facilité de simulation et de moquage à des fins de test, réduit le risque d'erreurs inaperçues induites par une reconfiguration accidentelle, la possibilité de "simuler à moitié" le nom supérieur dans une "classe de traçage" aux fins de la journalisation. exactement ce que vous utilisez et facilitez des activités telles que le profilage, etc. - inconvénients, à peu près aucun ... voir aussi le dernier mais non le moindre koan dans le zen de Python, import this à l'invite d'interprétation interactive) .

Tout aussi bien, si vous reprenez les 7 caractères supplémentaires pour dire QtCore.whatever, c’est abréger - from PyQt4 import QtCore as Cr et from PyQt4 import QtGi as Gu (utilisez ensuite Cr.blah et Gu.zorp) ou similaire. Comme toutes les abréviations, c’est un compromis de style entre concision et clarté (préférez-vous nommer une variable count_of_all_widgets_in_the_inventory, num_widgets ou x? Souvent le choix du milieu serait préférable, mais pas toujours ;-).

BTW, je ne voudrais pas utiliser plus d'une clause as dans une seule instruction from ou import (cela pourrait être déroutant), je préfère avoir plusieurs instructions (également plus facile à déboguer si une importation pose problème, à modifier si vous modifiez vos importations A l'avenir, ...).

41
Alex Martelli

Il y a aussi de bons cas pour import *. c'est à dire. Il est courant que les développeurs Django disposent de nombreux fichiers de configuration et les chaînent à l'aide de import *:

settings.py:
FOO = 1
BAR = 2
DEBUG = False

test_settings.py:
from settings import *
DEBUG = True

Dans ce cas, la plupart des inconvénients de import * deviennent des avantages. 

8
Tomasz Wysocki

Python doc dit:

Although certain modules are designed to export only names that follow certain patterns when you use import *, it is still considered bad practise in production code.

Cela peut avoir des effets secondaires et être très difficile à déboguer

Personnellement, j'utilise import plutôt que from import car je trouve d’énormes déclarations énormes au début du fichier et je pense que le code est plus lisible.

import PyQt4

PyQt4.QtCore

Si le nom du module est trop long et peut être renommé localement avec le mot clé as. Par exemple:

 import PyQt4.QtCore as Qc

J'espère que ça aide

3
luc

J'utilise "import *" pour les modules PyQt que j'utilise, mais je les ai mis dans leur propre module, afin de ne pas polluer l'espace de noms de l'utilisateur. par exemple.

Dans qt4.py:

 de PyQt4.QtCore import * 
 de PyQt4.QtGui import * 

Alors utilisez-le comme ça

 importer qt4 
 app = qt4.QApplication (...) 
1
xioxox

importer pour PyQt4 est un cas particulier.
Parfois, je choisis la "première option" pour un codage rapide et sale, et la passe à la "deuxième option" lorsque le code augmente de plus en plus.
La collision d’espaces de noms n’est peut-être pas très grave ici, je n’ai pas vu d’autres paquets commençant par un grand «Q». et chaque fois que je termine un script PyQt4. convertir "de PyQt4.QtGui import *" en qh. comme "

from PyQt4.QtGui import (QApplication, QDialog, QLineEdit, QTextBrowser,
                         QVBoxLayout)

" just FYI, les parenthèses pour les importations multilignes est pratique ici.

0
sunqiang