Sagen wir, ich beginne mit Paket pack
, die ein Modul foo.py
enthält.Ist das ein Python-Antipattern? 'import foo.foo as foo' Schatten den Rest des foo-Pakets
pack/
pack/__init__.py
pack/foo.py # Defines class Foo
Aber aus Gründen, ich entscheide, ich brauche foo.py
zu einem subpackage zu bewegen. Vielleicht ist mein Foo sehr stark und ich brauche mehr Funktionalität um es zu verwalten. Da die subpackage alles über foo ist, nenne ich es foo
als gut, so jetzt haben wir
pack/
pack/__init__.py
pack/foo
pack/foo/__init__.py
pack/foo/foo.py # Defines class Foo
„Ah“, sage ich, „Ich kompatibel Dinge rückwärts machen und vermeiden, Telefonvorwahl die übermäßige foo- zuzufügen ness von pack.foo.foo.Foo()
mit folgendem Import in pack/__init__.py
...
$ cat pack/__init__.py
import foo.foo as foo
... damit ich pack.foo.Foo()
verwenden, um ein Foo
zu initialisieren.“
Leider bedeutet dies, das Modul foo.py
Schatten den Rest des foo
Pakets, so dass nur der Inhalt von pack/foo/foo.py
sichtbar sind.
Das ist alles erwartete Verhalten, meine Frage ist, würde dies auf das Niveau eines Antipattern steigen? Es sieht so aus, als ob die Entscheidungen bei jedem Schritt einen gewissen Sinn ergeben, also ist es ein einfacher Weg, um runter zu wandern (ich habe ein paar Mal), bis all die zusätzliche Funktionalität, die das Unterpaket motiviert hat, sagt "Hey, was ist mit uns?"
Gibt es einen pythonischen Weg, ein Modul zu einem solchen Unterpaket zu machen, unter Berücksichtigung der Namens- und Rückwärtskompatibilität? Die foo.foo.Foo
insbesondere ist ärgerlich (datetime.datetime
ungeachtet), aber vielleicht ist die Antwort "nur damit umgehen" und essen die Rückwärtsinkompatibilität. Ich spielte mit einem from foo import *
irgendwo, aber das scheint falsch. Oder fehlt mir eine einfache Lösung?
Ich denke, die offensichtliche Antwort ist: Benenne Dinge nicht mit albernen verschachtelten Namen wie 'foo.foo.Foo' an erster Stelle. Während Namespaces eine tolle Idee sind (lasst uns mehr davon tun!), Sind verschachtelte Namespaces über ein oder zwei Levels hinaus nervend. Wenn Sie * wirklich * geschachtelte Pakete haben müssen, geben Sie ihnen mindestens sinnvolle (nicht duplizierte) Namen auf jeder Ebene. – Blckknght
Ich stimme definitiv tiefen Namespaces zu, aber dies ist nur eine zusätzliche Ebene, und Beispiele sind reichlich vorhanden (os.path, Logging-Konfiguration, die redundante redundante datetime.datetime). Es muss nicht einmal der Wunsch sein, es zu tun, sondern eine Verführung bei jedem Schritt auf dem Weg. :) – Scott
ja, aber dieses Problem existiert nicht, wenn Sie 'foo.foo' haben. Warum sind die Inhalte von 'foo.foo' nicht in' foo'? 'datetime.datetime' ist kein Modul. Und es ist auch sehr schlecht benannt. –