MoonKid hat geschrieben:__version__ scheint sich hier (vermutlich aus Sicherheitsgründen) jedoch nicht im globalen Namensraum zu befinden.
Doch, genau im globalen Namensraum befindet sich ``__version__``. Und mit Sicherheit hat das nichts mit Sicherheit zu tun, auch wenn manchmal behauptet wird, dass doppelte Unterstriche den Zugriff auf einen Namen von außen verhindern und damit sicher machen würden. Das ist Quatsch.
Sternchenimporte importieren in den Namensraum des importierenden Moduls. Deshalb kannst Du ja eben ``print(__version__)`` machen.
Wenn nun allerdings das importierende Modul selbst einen Namen ``__version__`` besitzt oder Du nach dem Sternchenimport nochmals einen Sternchenimport eines Moduls machst, das ebenfalls den Namen ``__version__`` verwendet, wird ``__version__`` jedesmal überschrieben. Und genau deswegen solltest Du Sternchenimporte auch vermeiden. Ein weiterer Grund das zu vermeiden ist auch der, dass ein ``sqlalchemy.__version__`` ganz klar ausdrückt, worauf sich ``__version__`` bezieht. Dein Code wird dadurch leichter lesbar und verständlicher.
Wenn man, aus welchen Gründen auch immer, nur Teile eines Moduls importieren möchte, kann man auch ``from sqlalchemy import __version__ as sqlversion`` machen. Damit importierst Du nur die Konstante ``__version__`` in den Namensraum des importierenden Moduls und bindest diese dort an den Namen ``sqlversion``. Oder ``from sqlalchemy import __version__`` ohne einen eigenen Namen für ``__version__`` zu vergeben.
Ich persönlich bevorzuge das Importieren des gesamten Moduls und den Zugriff auf dessen Inhalt über den Punktoperator. Damit weiß ich immer, woher die Dinge stammen...
mutetella