Seite 1 von 1

Gemeinsamer Namensraum für mehrere Produkte

Verfasst: Donnerstag 26. Mai 2011, 09:37
von deamon
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
			...

Re: Gemeinsamer Namensraum für mehrere Produkte

Verfasst: Donnerstag 26. Mai 2011, 10:17
von 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

Re: Gemeinsamer Namensraum für mehrere Produkte

Verfasst: Donnerstag 26. Mai 2011, 11:45
von lunar
Alternativ pkgutil.extend_path().

Siehe auch PEP 382.

Re: Gemeinsamer Namensraum für mehrere Produkte

Verfasst: Sonntag 3. Juli 2011, 08:27
von deamon
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?

Re: Gemeinsamer Namensraum für mehrere Produkte

Verfasst: Sonntag 3. Juli 2011, 10:10
von 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.