Frage zu Modul import

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
.exe
User
Beiträge: 27
Registriert: Mittwoch 14. Januar 2009, 11:16

Mittwoch 14. Januar 2009, 11:30

Also erstmal Hi,

ich beschäftige mich jetzt seid ca 1 Woche mit Python und muss sagen es gefällt mir sehr gut (komm aus der Java ecke :wink: ). Jetzt habe ich nur ein kleines Problem. Ich Versuche mit deiner relativen Importanweisung ein Modul aus einem übergeordneten Pakt einzubinden.

Die Struktur der Pakete sieht wie folgt aus:

Taschenrechner
| |
| |------------>anzeige
|
|--------------------->operationen

Das Problem was ich jetzt habe ist, dass ich aus einem Modul in dem Packet "anzeige" das packet "operationen" mit Modul "addition" importieren möcht.

Da ich zum einarbeiten das Buch Python "Das umfassende Handbuch" zur hand habe binn ich auf

Code: Alles auswählen

 from ..operationen import addition

gestossen. Nur bekomme ich immer die Fehlermeldung

Code: Alles auswählen

Attempted relative import beyond toplevel package
Das versteh ich aber nicht denn mit ".." komme ich ich in den Toplevel Taschenrechner und rufe von da aus operationen mit dem modul auf.

Also wenn mir (<--python noob) wer helfen mag wär ich sehr verbunden.

mfg
.exe

p.s: Ich weis ein Taschenrechner ist nicht so die tolle bzw schwerste aufgabe aber zum einarbeiten durch aus brauchbar ^^
Benutzeravatar
bwbg
User
Beiträge: 381
Registriert: Mittwoch 23. Januar 2008, 13:35

Mittwoch 14. Januar 2009, 12:51

Mein Versuch an einen Taschenrechner mit (G)UI heranzugehen, wäre, ein Modul calculator.py zu schreiben, mit einer Klasse Calculator und den entsprechenden Schnittstellen.

Code: Alles auswählen

class Calculator(object):
     # ...
Dazu ein Modul names userinterface.py welches eine Klasse UserInterface definiert. Bei der Instanzierung müsste dann eine Calculator-Instanz übergeben werden.

Code: Alles auswählen

class UserInterface(object):
    def __init__(self, calculator_instance):
        self.calculator = calculator_instance
    # ...
UserInterface muss nun nichteinmal von Calculator wissen. Es reicht, wenn die Schnittstellen korrekt verwendet werden. So kannst du eine (verbesserte) Version (z.B. MyImprovedCalculator) verwenden, ohne überhaupt am UserInterface etwas ändern zu müssen.

Um auf dein Beispiel zurück zu kommen:

Die Anzeige muss nicht rechnen können. Sie muss dem (logischen) Taschenrechner nur die notwendigne Daten liefern können, damit dieser die Berechnung ausführen kann.

Zusammen kommen beide in einem Startskript á la

Code: Alles auswählen

import calculator
import userinterface

def main():
    calc = calculator.Calculator()
    ui = userinterface.UserInterface(calculator_instance=calc)

if __name__ == '__main__':
    main()
Im Übrigen könnte man das auch gut in ein einziges Modul stecken. Es besteht (noch) kein Anlass, das in Module oder sogar Pakete aufzuteilen. Pakete strickte ich in der Regel so, dass diese wie eine "normale" Bibliothek verwendet werden könnten.

Grüße... Heiko
Antworten