[Python-de] private Function in Modul
Stefan Schwarzer
sschwarzer at sschwarzer.net
Mi Sep 4 22:48:23 CEST 2013
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
Mehr Informationen über die Mailingliste python-de