Gemeinsamer Namensraum für mehrere Produkte

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
deamon
User
Beiträge: 63
Registriert: Mittwoch 8. Oktober 2008, 11:14

Ich würde gerne mehrere Python-Produkte unter einem Dach versammeln und ihnen auf oberster Ebene den gleichen Namensraum geben; etwa so: firmax.produkt1, firmax.produkt2 usw. Ich will sozusagen, dass man später im Code schreiben kann:
import firmax.produkt1
import firmax.produkt2

Aber wie macht man das in Python wo Paketnamen ausschließlich durch Namen der Verzeichnisse festgelegt werden? Macht man das so:

Code: Alles auswählen

produkt1/ # als Name der Verteilungseinheit (.egg usw)
	# kein __init__.py deshalb kein Namensraumbestandteil?
	firmax/
		__init__.py
		produkt1/
			__init__.py
			...
	
produkt2/ # als Name der Verteilungseinheit (.egg usw)
	firmax/
		__init__.py
		produkt2/
			__init__.py
			...
deets

Sowas nennt sich namespace-packages, und ist en detail auf der setuptools seite beschrieben. Sehr praktisches feature ;)

http://peak.telecommunity.com/DevCenter ... e-packages
deamon
User
Beiträge: 63
Registriert: Mittwoch 8. Oktober 2008, 11:14

Danke für eure Antworten. Die von euch verlinkten Seiten und weitere Lektüre lassen mich allerdings etwas verwirrt zurück. Denn warum braucht man überhaupt einen Mechanismus wie "pkgutil.extend_path"? Warum kann man nicht einfach zwei Verteilungseinheiten (der Name "Paket" ist ja bei Python schon anderweitig belegt) mit jeweils dem gleichen Basisverzeichnis anlegen?

Auf der PEAK-Seite steht dazu:
However, Python does not normally allow the contents of a package to be retrieved from more than one location. "Namespace packages" are a solution for this problem.
Was hat Python für ein Problem damit? Ich habe ein Beispiel gefunden, wo kein Mechanismus wie "extend_path" aufgerufen wird - oder das Beispiel ist unvollständig. Allerdings kommt in den Metadaten der Wert "namespace_packages" vor, der aber nicht in den Python distutils vorkommt:

Code: Alles auswählen

setup(name='acme.sql',
      # ...
      namespace_packages=['acme'])
Also brauche ich in jedem Fall sowas wie "pkgutil.extend_path"? Und wenn ja: warum?
deets

Bist du sicher, dass du das alles wirklich gelesen hast? Dann haette dir naemlich auffallen muessen, dass dein zitiertes Beispiel sich auf "setuptools" bezieht, die ich ja schon erwaehnt habe.

Und die Frage nach dem warum: Im Gegensatz zu Java erlaubt Python, auf Modulebene auch andere Dinge ausser Klassendefinitionen.

Wenn du jetzt 3 Pakete hast, die sich alle einen Namensraum "foo" teilen sollen, dann sieht das ja unter anderem so aus:

a/foo/__init__.py
b/foo/__init__.py
c/foo/__init__.py

So, und wer macht darin jetzt was? In welcher Reihenfolge werden die ausgefuehrt? Kennt der eine die Namen des anderen? Wie werden Namenskonflikte aufgeloest? Usw. usf. Das alles bestenfalls kompliziert, und darum ist es auch nicht erlaubt. Stattdessen kannst du eben nur *explizit* den foo-Namensraum definieren, und darin darf dann niemand etwas machen, und nur packages drin sein.

Also, ja, du brauchst das wirklich.
Antworten