private Function in Modul
Hallo, ich habe in einer Moduldatei "Utilities.py" mehrere Funktionen, einfache defs. Ich nutze den Inhalt einfach mittels import Utilites Utilities.Function(…) Es ist im Grunde nur eine kurze Funktionsdefinition. Ich möchte aber eigentlich gerne noch Sichtbarkeiten habe, d.h. einige Funktion werden nur in diesem Modul benötigt (also Function ruft Function2 auf und Function2 wird niemals von außen aufgerufen). Gibt es eine Methode, wie ich die Sichtbarkeiten hinein bekomme? Ich möchte eigentlich keine Klassenstruktur (mittels Metaklasse) implementieren, sondern nur dafür Sorge tragen, dass einige Funktionen nicht von außen aufgerufen werden können. Wie kann ich das realisieren? Danke Phil
Philipp Kraus wrote:
ich habe in einer Moduldatei "Utilities.py" mehrere Funktionen, einfache defs. Ich nutze den Inhalt einfach mittels
import Utilites Utilities.Function(…)
Empfohlene Lektüre: http://www.python.org/dev/peps/pep-0008/#naming-conventions
Es ist im Grunde nur eine kurze Funktionsdefinition. Ich möchte aber eigentlich gerne noch Sichtbarkeiten habe, d.h. einige Funktion werden nur in diesem Modul benötigt (also Function ruft Function2 auf und Function2 wird niemals von außen aufgerufen). Gibt es eine Methode, wie ich die Sichtbarkeiten hinein bekomme? Ich möchte eigentlich keine Klassenstruktur (mittels Metaklasse) implementieren, sondern nur dafür Sorge tragen, dass einige Funktionen nicht von außen aufgerufen werden können.
Wie kann ich das realisieren?
Es gibt die Konvention, private Funktionen, Klassen etc. mit einem Unterstrich beginnen zu lassen. Sie erscheinen dann nicht in der Hilfe: $ cat tmp.py def f(): "yadda yadda" def _g(): "private func" $ python [...]
help("tmp") Help on module tmp:
NAME tmp FILE /path/to/tmp.py FUNCTIONS f() yadda yadda Wer solche Funktionen trotzdem benutzen möchte, kann das natürlich. Ich empfehle, auf Maßnahmen, die das erschweren, zu verzichten.
Hallo Philipp, On 2013-09-04 08:57, Philipp Kraus wrote:
ich habe in einer Moduldatei "Utilities.py" mehrere Funktionen, einfache defs. Ich nutze den Inhalt einfach mittels
import Utilites Utilities.Function(…)
Es ist im Grunde nur eine kurze Funktionsdefinition. Ich möchte aber eigentlich gerne noch Sichtbarkeiten habe, d.h. einige Funktion werden nur in diesem Modul benötigt (also Function ruft Function2 auf und Function2 wird niemals von außen aufgerufen). Gibt es eine Methode, wie ich die Sichtbarkeiten hinein bekomme? Ich möchte eigentlich keine Klassenstruktur (mittels Metaklasse) implementieren, sondern nur dafür Sorge tragen, dass einige Funktionen nicht von außen aufgerufen werden können.
zusätzlich zu den führenden Unterstrichen, die Peter genannt hat, gibt es noch die Möglichkeit, eine Liste `__all__` auf Modulebene anzulegen. In diese Liste trägst du die Namen der "sichtbaren" Bezeichner als Strings ein. Beispiel: $ cat test.py __all__ = ["f"] def f(): pass def g(): pass Die Hilfe gibt dann nur die Objekte aus `__all__` an: $ python -c "import test; help(test)" Help on module test: NAME test FILE /tmp/test.py FUNCTIONS f() DATA __all__ = ['f'] (plus einige besondere Namen, wie man unten sieht). Ich finde diesen Ansatz etwas symphatischer als die führenden Unterstriche, die nach meinem Geschmack, besonders wenn sie in größerer Zahl auftreten, etwas "aufdringlich" wirken. Davon abgesehen verhindert die Definition von `__all__` ebenso wie die Variante mit den führenden Unterstrichen _nicht_, dass auf die "privaten" Namen zugegriffen wird. Wer das unbedingt will, kann also `g` im obigen Beispiel immer noch verwenden. Das kann aber zum Testen und fürs Debugging immer noch nützlich sein. Viele Grüße Stefan
participants (3)
-
Peter Otten
-
Philipp Kraus
-
Stefan Schwarzer