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 ;~)