[3.3] Pakete mit mehreren Implementierungen importieren
Verfasst: Sonntag 20. April 2014, 15:18
Moin,
für die Terminalausgabe würde ich gerne zwei Implementierungen anbieten, die das gleiche interface haben und möglichst transparent als Pakete importiert werden sollen. Clients sollen am besten gar nicht merken, dass es mehr als ein Paket gibt. Leider habe ich damit ziemliche Probleme gehabt, die ich teilweise noch nicht einmal verstehe. Mein erster, naiver Versuch sah so aus:
Ich weiß, import * ist tabu. Ich dachte, ich könne die Implementierung so ganz elegant paketintern lösen und die Unterpakete einfach als '"terminal" selbst ausgeben. Daraus ergaben sich aber zu viele Probleme, vor allem wusste ich irgendwann gar nicht mehr unter welchem Namen, in welchem Kontext, ein Modul jetzt anzusprechen ist. Deshalb frage ich diesmal lieber vorher, wie es richtig geht, ehe ich meinen zweiten Versuch starte.
Wie wäre das hier?
Clients könnten das Paket so als terminal ansprechen ohne sich um die Implementierung zu kümmern, während im Paket selbst Module einander entweder explizit relativ oder absolut mit import term_impl.ncurses.foo as foo importieren können, ohne dass es zu Konflikten kommt, oder?
Danke für jede Entwirrung.
PS: Ich komme von Java, vielleicht erklärt das meine Probleme mit import ;~)
für die Terminalausgabe würde ich gerne zwei Implementierungen anbieten, die das gleiche interface haben und möglichst transparent als Pakete importiert werden sollen. Clients sollen am besten gar nicht merken, dass es mehr als ein Paket gibt. Leider habe ich damit ziemliche Probleme gehabt, die ich teilweise noch nicht einmal verstehe. Mein erster, naiver Versuch sah so aus:
Code: Alles auswählen
in main.py:
import terminal
terminal.init(80, 25)
terminal.puts("Hello, Terminal!")
in terminal/__init__.py:
# import the actual terminal implementation into this package:
import config
if config.backend.lower() == "curses":
from terminal.ncurses import *
else:
from terminal.sdl import *
Wie wäre das hier?
Code: Alles auswählen
:
in getterm.py:
import config
if config.backend.lower() == "curses":
import term_impl.ncurses as terminal
else:
import term_impl.sdl as terminal
in client.py:
from getterm import terminal # ist das okay so? sieht suboptimal aus.
terminal.init(80, 25)
terminal.puts("Hello, Terminal!")
Clients könnten das Paket so als terminal ansprechen ohne sich um die Implementierung zu kümmern, während im Paket selbst Module einander entweder explizit relativ oder absolut mit import term_impl.ncurses.foo as foo importieren können, ohne dass es zu Konflikten kommt, oder?
Danke für jede Entwirrung.
PS: Ich komme von Java, vielleicht erklärt das meine Probleme mit import ;~)