import mit '.' ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MoonKid
User
Beiträge: 105
Registriert: Mittwoch 10. Dezember 2014, 16:24

Ich sehe in einigen Codes

Code: Alles auswählen

from . something
Wofür steht der Punkt? Ist something in dem Fall eine Klasse oder ein Modul - oder wäre beides möglich?

Bei der Doku finde ich keinen sinnvollen Eintrag - wobei er sicherlich existiert. Hab im Index nach "import" gesucht.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Schau mal im Tutorial nach "Intra-package references".
MoonKid
User
Beiträge: 105
Registriert: Mittwoch 10. Dezember 2014, 16:24

Da steig ich nicht ganz dahinter. Es werden also Module, keine Klassen, importiert? Hab ich das soweit richtig verstanden?

Es kann relativ zum aktuellen Modul (so wie in einem Dateisystem) importiert werden.
'.' bedeutet also im gleichen Verzeichnis bzw. der gleichen Ebene.

Bei meinem Verständnis sind diese beiden imports dann genau gleich

Code: Alles auswählen

from . import modul
import modul
Daher verstehe ich nicht, warum man das überhaupt tun sollte.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Nicht wenn der 1. import in einem Modul aufgerufen wird, dass sich nicht in der obersten Ebene befindet.

Wie du schon sagst, wie einem Dateisystem.
# tree
.
|-- sub
| |-- __init__.py
| |-- modc.py
| |-- modd.py
`-- test.py

# cat test.py
from sub import modc
# cat sub/modc.py
import modd

# python3 test.py
Traceback (most recent call last):
File "test.py", line 1, in <module>
from sub import modc
File "/tmp/test/sub/modc.py", line 1, in <module>
import modd
ImportError: No module named modd

# echo "from . import modd" > sub/modc.py
# python3 test.py
#
BlackJack

@MoonKid: Stell Dir vor es gibt ein systemweites Modul `spam` und eines im Package `parrots`. Und im Packache `parrots` gibt es ein Modul `frob` und das verwendet ein ``import spam``. Welches `spam`-Modul wird da importiert? Bei ``from . import spam`` ist klar welches: das im Package.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

"from . import XY" sollte man sich angewöhnen, was?

Aber welche Python Version geht das eigentlich? War doch irgendwann neu, oder?

btw. wie bekommt man PyCharm dazu, das automatisch zu machen?

EDIT: Kann es wohl noch nicht:

Bild

Schade...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

BlackJack hat geschrieben:@MoonKid: Stell Dir vor es gibt ein systemweites Modul `spam` und eines im Package `parrots`. Und im Packache `parrots` gibt es ein Modul `frob` und das verwendet ein ``import spam``. Welches `spam`-Modul wird da importiert? Bei ``from . import spam`` ist klar welches: das im Package.
Grundsätzlich sollte man allerdings ohnehin ``from __future__ import absolute_import`` nutzen, dann ist auch bei einem ``import spam`` klar was gemeint ist.
Antworten