[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