PEP 302 (Import Hooks) für bottle plugins?

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
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Hi Leute,
seit längerem auch mal wieder eine Frage von mir.

Ich möchte, das andere Leute Plugins und Erweiterungen für Bottle schreiben und diese (ohne mein Zutun) unter einem einheitlichen Namensraum veröffentlichen können. Flask löst das mit "flaskext" Namespace-Paketen. Dummerweise ist dieses Feature eine Eigenart von setuptools (und das ist, auch wenn es fast überall vorhanden ist, eine externe Abhängigkeit die ich vermeiden will) und ist auch sonst mit recht vielen Fallstricken verbunden. Zum Beispiel müssen Plugins dann Pakete sein (keine single-file Plugins möglich) und peinlich genau darauf achten, das ihre __init__.py und setup.py korrekt sind. Wenn nicht, fliegt einem das ganze Paket-Management um die Ohren.

Daher tüftle ich gerade an einem kleinen PEP 302 Import-Hook, der ...

Code: Alles auswählen

import bottle.ext.sqlite
from bottle.ext import some_plugin
... ermöglicht, obwohl "bottle" ein Modul (und kein Paket) ist und "bottle.ext" eigentlich gar nicht existiert. Im Hintergrund wird dann "bottle_sqlite" bzw. "bottle_some_plugin" importiert. Das echte Modul wird im kompletten sys.path gesucht, kann also auch im lokalen Pfad liegen. Nett, oder?

Die Frage ist nun: Ist das zu viel Magie? Es ist alles Python- und PEP-konform und läuft zuverlässig, aber könnte das zu Verwirrung führen? Was meint ihr?
Zuletzt geändert von Defnull am Donnerstag 28. April 2011, 09:58, insgesamt 1-mal geändert.
Bottle: Micro Web Framework + Development Blog
lunar

Ich finde die Idee nett, und für meinen Teil auch wesentlich schöner als die setuptools-Magie. Du musst es halt nur ausführlich dokumentieren.

Vielleicht ist es auch sinnvoll, für die Namen der Plugins ungültige Modulnamen zu nutzen, also statt "bottle_sqlite.py" etwas wie "bottle.plugin.sqlite.py", was man über einen normalen "import" nicht laden kann. Dann gibt es nur einen einzigen Weg, Plugins zu importieren, nämlich eben über den Import-Hook, was erstes das Zen erfüllt, und zweitens Verwirrung vermeidet.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ich fand es gerade Sinnvoll, das man auf "import bottle_sqlite" zurück greifen kann, wenn der "import bottle.ext.sqlite" Hook (warum auch immer) nicht funktioniert. Außerdem benutzt mein Trick intern einen ganz normalen __import__() Aufruf (ich hatte keine Lust, die komplette import Strategie zu implementieren) und dafür braucht man gültige Modulnamen.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

@defnull: Ich finde die Idee gut. Die Syntax wirkt schlüssig.

Auf eine Benennung wie bottle.plugin.sqlite.py würde ich verzichten. Gerade zum Spielen mit einem Modul will man es ja auch mal ohne irgendwas drumrum importieren können.
lunar

Gut, daran habe ich nicht gedacht.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Für Interessierte, so funktioniert das Ganze: https://github.com/defnull/bottle/commi ... 890d06516d
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Nur so als kleine Anmerkung: Wir reden hier bei diesem Konzept aber über PEP-302 und nicht 306, oder?
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

/me hat geschrieben:Nur so als kleine Anmerkung: Wir reden hier bei diesem Konzept aber über PEP-302 und nicht 306, oder?
Ups, ja, natürlich :oops:
Bottle: Micro Web Framework + Development Blog
Antworten