it-swarm.com.de

Sollte der Import von Platzhaltern vermieden werden?

Ich verwende PyQt und stoße auf dieses Problem. Wenn meine Importanweisungen sind:

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

dann gibt Pylint Hunderte von Warnungen "Nicht verwendeter Import" aus. Ich zögere, sie einfach auszuschalten, da es möglicherweise andere nicht verwendete Importe gibt, die tatsächlich nützlich sind. Eine andere Möglichkeit wäre, dies zu tun:

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

und am Ende habe ich 9 Klassen auf der QtGui-Linie. Es gibt eine dritte Option:

from PyQt4 import QtCore, QtGui

und dann allen Klassen QtCore oder QtGui voranstellen, wann immer ich sie verwende.

An diesem Punkt bin ich nicht sicher, was ich letztendlich in meinem Projekt mache, obwohl das letzte aus meiner Sicht am schmerzhaftesten erscheint. Was sind die gängigen Praktiken hier? Gibt es einen technischen Grund, einen Stil über dem anderen zu verwenden?

40
Colin

Die Antwort auf den Titel Ihrer Frage lautet "Ja": Ich empfehle niemals, from ... import * zu verwenden, und ich habe die Gründe in einer anderen, sehr aktuellen Antwort besprochen. Kurz gesagt, qualifizierte Namen sind good , Barennamen sind sehr begrenzt, daher ist die "dritte Option" optimal (da Sie qualifizierte Namen verwenden, nicht Barennamen).

(Die Vorteile qualifizierter Namen bei Barennamen umfassen die einfache Fälschung/Verspottung zu Testzwecken, die das Risiko unbemerkter Fehler durch versehentliches erneutes Binden auf ein Null reduziert, die Fähigkeit, den obersten Namen in einer "Tracing-Klasse" zu Protokollierungszwecken "zu fälschen") genau das, was Sie verwenden und wie Aktivitäten wie Profiling und so weiter erleichtern - Nachteile, so gut wie keine ... sehen Sie auch den vorletzten Koan im Zen of Python, import this im interaktiven Interpreter (Prompt). .

Gleichermaßen gut, wenn Sie die 7 zusätzlichen Zeichen QtCore.whatever ärgern, heißt from PyQt4 import QtCore as Cr und from PyQt4 import QtGi as Gu (dann Cr.blah und Gu.zorp) oder ähnliches abkürzen. Wie bei allen Abkürzungen handelt es sich hierbei um einen Stil-Kompromiss zwischen Prägnanz und Klarheit (möchten Sie eher eine Variable count_of_all_widgets_in_the_inventory, num_widgets oder x nennen)? Oft wäre die mittlere Wahl die beste, aber nicht immer ;-).

Übrigens, ich würde nicht mehr als eine as-Klausel in einer einzelnen from- oder import-Anweisung verwenden (dies könnte verwirrend sein), ich hätte lieber mehrere Anweisungen (auch einfacher zu debuggen, wenn ein Import zu Problemen führt, zu bearbeiten, wenn Sie Ihre Importe ändern.) in der Zukunft, ...).

41
Alex Martelli

Es gibt auch gute Fälle für import *. dh. Es ist üblich, dass Django-Entwickler viele Konfigurationsdateien haben und diese mithilfe von import * verketten:

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

test_settings.py:
from settings import *
DEBUG = True

In diesem Fall werden die meisten Nachteile von import * zu Vorteilen. 

8
Tomasz Wysocki

Python doc sagt:

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.

Es kann Nebenwirkungen haben und sehr schwer zu debuggen sein

Ich persönlich verwende import anstelle von from import, da ich am Anfang der Datei schreckliche große Deklarationen finde und der Code lesbarer wird

import PyQt4

PyQt4.QtCore

Wenn der Modulname zu lang ist und lokal mit dem Schlüsselwort as umbenannt werden kann. Zum Beispiel:

 import PyQt4.QtCore as Qc

Ich hoffe, es hilft

3
luc

Ich verwende "import *" für die von mir verwendeten PyQt-Module, füge sie jedoch in ein eigenes Modul ein, sodass der Namespace des Benutzers nicht verschmutzt wird. z.B.

In qt4.py:

 aus PyQt4.QtCore-Import * 
 aus PyQt4.QtGui-Import * 

Dann benutze es so

 import qt4 
 app = qt4.QAnwendung (...) 
1
xioxox

import für PyQt4 ist ein Sonderfall.
Manchmal wähle ich die "erste Option" für die schnelle und fehlerhafte Codierung und wende sie auf die "zweite Option", wenn der Code länger und länger wird.
Namespace-Kollision ist vielleicht keine große Sache, ich sehe keine anderen Paketnamen, die mit einem großen "Q" beginnen. und wann immer ich ein PyQt4-Skript fertiggestellt habe. konvertieren Sie "from PyQt4.QtGui import *" in etw. mögen "

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

" nur zu Ihrer Information, Klammern für den Import mit mehreren Zeilen ist hier praktisch.

0
sunqiang

Ich bin zu absolut gegen import * im allgemeinen Fall. Im Falle des PySide2 gilt eine der seltenen Ausnahmen:

from PySide2 import *

ist das Muster zum Importieren aller bekannten Module aus PySide2. Dieser Import ist sehr praktisch, da der Import immer korrekt ist. Die Konstante wird vom Generator CMAKE berechnet. Sehr hilfreich, wenn Sie schnell etwas in der interaktiven Konsole ausprobieren, aber auch beim automatisierten Testen.

Für den fortgeschrittenen Gebrauch ist es auch sinnvoll, das PySide2.__all__ Variable direkt, die diese Funktion implementiert. Die Elemente von PySide2.__all__ werden nach Abhängigkeiten sortiert, also zuerst QtCore, dann QtGui, QtWidgets, ... und so weiter.

0