2014-03-27 6 views
10

Ich bin neu in Python. Ich entwickle ein kleines Projekt. Ich muss Kodierungsstandards folgen, beginnend auf Stationen. Wie man import Anweisungen richtig verwendet. Jetzt arbeite ich an Python 2.7. Wenn ich nach 3.x gehe, gibt es Konflikte mit absoluten Importen? Und was ist der Unterschied zwischen absoluten und relativen Importen?Was ist absoluter Import in Python?

+0

Können Sie bitte klarstellen, was absolute und relative Importe sind? –

+4

@ Ol'Reliable Sie werden in [PEP 328] (http://legacy.python.org/dev/peps/pep-0328/) beschrieben. –

Antwort

18

Die Unterscheidung zwischen absolute und relative, die hier gezeichnet wird, ist sehr ähnlich zu der Art, wie wir über absolute und relative Dateipfade oder sogar URLs sprechen.

absolute Eine {import, Pfad, URL} sagt Ihnen genau, wie das, was Sie nach sind zu bekommen, in der Regel von jedem Teil festgelegt wird: genau

import os, sys 
from datetime import datetime 
from my_package.module import some_function 

Relative {Importe, Pfade, URLs} sind was sie sagen sie sind: sie sind relativ an ihren aktuellen Standort. Das heißt, wenn sich die Verzeichnisstruktur ändert oder die Datei verschoben wird, können diese brechen (weil sie nicht mehr dasselbe bedeuten).

from .module_in_same_dir import some_function 
from ..module_in_parent_dir import other_function 

Daher werden absolute Importe für Code bevorzugt, der geteilt wird.


Ich wurde in den Kommentaren gebeten, ein Beispiel dafür, wie from __future__ import absolute_import Bindungen in diesen zu schaffen, und wie ist gemeint, verwendet werden. Als ich versuchte, dieses Beispiel zu formulieren, wurde mir klar, dass ich sein Verhalten auch nicht erklären konnte, also ich asked a new question. This answer gibt ein Codebeispiel, das eine korrekt funktionierende Implementierung von from __future__ import absolute_import zeigt, in der es tatsächlich eine Mehrdeutigkeit auflöst.

The accepted answer geht ausführlicher darüber, warum dies so funktioniert, einschließlich einer Diskussion über den verwirrenden Wortlaut des Python 2.5 changelog. Im Wesentlichen ist der Anwendungsbereich dieser Richtlinie (und damit die Unterscheidung zwischen absoluten und relativen Importen in Python) sehr, sehr eng. Wenn Sie feststellen, dass Sie diese Unterscheidungen benötigen, damit Ihr Code funktioniert, ist es wahrscheinlich besser, wenn Sie Ihr lokales Modul nach Möglichkeit umbenennen.

+0

Das hätte ich auch gedacht. Aber wenn das der Fall ist, warum funktionieren die Importe der letztgenannten Form noch, wenn ich "from __future__ import (absolute_import)" habe? – orome

+2

@raxacoricofallapatorius Angenommen, Sie haben ein lokales Modul namens 'string'. Sie öffnen einen Interpreter und geben "import string" aus. Python 2.5 würde Ihnen das lokale Modul geben. Python 2.7+ würde Ihnen die [string] (https://docs.python.org/2/library/string.html) Bibliothek geben. Diese zukünftige Anweisung verschiebt Python 2.5 in das Standardverhalten von 2.7. Die gepunkteten Formen sind explizit relativ, so dass keine Zweideutigkeit mit der Standardbibliothek möglich ist. Daher arbeiten sie immer gleich. [Mehr] (https://docs.python.org/2.5/whatsnew/pep-328.html) –

+0

Ah ich sehe, 'von __future__ absolute_import' verbietet * implizite * relative Importe (explizite sind in Ordnung). Richtig? – orome