Seite 1 von 1

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

Verfasst: Dienstag 26. April 2011, 23:56
von Defnull
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?

Re: PEP 306 (Import Hooks) für bottle plugins?

Verfasst: Mittwoch 27. April 2011, 13:38
von 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.

Re: PEP 306 (Import Hooks) für bottle plugins?

Verfasst: Mittwoch 27. April 2011, 15:29
von Defnull
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.

Re: PEP 306 (Import Hooks) für bottle plugins?

Verfasst: Mittwoch 27. April 2011, 15:51
von HerrHagen
@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.

Re: PEP 306 (Import Hooks) für bottle plugins?

Verfasst: Mittwoch 27. April 2011, 16:50
von lunar
Gut, daran habe ich nicht gedacht.

Re: PEP 306 (Import Hooks) für bottle plugins?

Verfasst: Donnerstag 28. April 2011, 00:02
von Defnull
Für Interessierte, so funktioniert das Ganze: https://github.com/defnull/bottle/commi ... 890d06516d

Re: PEP 306 (Import Hooks) für bottle plugins?

Verfasst: Donnerstag 28. April 2011, 06:38
von /me
Nur so als kleine Anmerkung: Wir reden hier bei diesem Konzept aber über PEP-302 und nicht 306, oder?

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

Verfasst: Donnerstag 28. April 2011, 10:01
von Defnull
/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: