[Python-Leipzig] Treffen am Dienstag, 12. Mai 2015, 20:00 Uhr

Stefan Schwarzer sschwarzer at sschwarzer.net
Sa Mai 23 21:44:17 UTC 2015


On 2015-05-15 21:30, Martin Meinhardt wrote:
> Am 15.05.2015 09:47, schrieb Stefan Schwarzer:
>> - Ich bin mir nicht so sicher, inwieweit man einen
>>    `get_`-Präfix verwenden sollte. Warum heißt es bei
>>    `Collection` zum Beispiel `count` (ohne `get`), aber
>>    `get_element` (mit `get`)?
>>
>>    Ich bin seit langer Zeit dazu übergegangen, keine
>>    `get_`-Präfixe mehr zu verwenden und werde das höchstens
>>    ändern, wenn mir jemand ein überzeugendes Kriterium nennen
>>    kann, wann man `get_` verwenden sollte und wann nicht. :-)
>>
>>    Das einzige Kriterium, das ich mir vorstellen kann, ist,
>>    `get_` bei jeder Query-Methode zu verwenden, aber das
>>    würde viele APIs recht geschwätzig machen.
>>
>>    Kennt jemand ein gutes Kriterium dafür, wann man einen
>>    `get_`-Präfix verwenden sollte?
> 
> Zum "get_"-Präfix viel mir der sehr gute Vortrag "Beyond PEP 8 -- Best 
> practices for beautiful intelligible code" ein, den Raymond Hettinger 
> auf der PyCon 2015 gehalten hat. Ab 28:36[1] bis 29:37 äußert er sich zu 
> 'getters' und 'setters'. (Das gesamte Video ist unbedingt sehenswert.)

Heute bin ich endlich mal dazu gekommen, mir das Video
anzusehen. In der Tat sehr interessant; danke für den Link! :)

Nach meiner Vermutung geht es Raymond darum, _diejenigen_
Getter/Setter durch Propertys zu ersetzen, die einfach nur
Attribute zurückgeben oder setzen.

Ich würde _nicht_ _jede_ Methode, die einen Wert
zurückliefert, als Property formulieren. Insbesondere wäre
mir nicht wohl dabei, Dinge als Property auszudrücken, deren
Abfrage einen Datenbank-Zugriff oder eine Netzwerk-Operation
anstößt. In dem Fall bevorzuge ich eine Methode, um
anzudeuten, dass hier mehr passieren kann als ein
Attribut-Zugriff und dass es hier Fehler geben kann, die
über einen `AttributeError` hinausgehen. Ich schätze, das
kann besonders beim Debugging einige Verwirrung vermeiden.

> Innerhalb einer Klasse würde ich den Setter und Getter für die Property 
> mit "get_" oder "set_" bezeichnen. Nach außen, wo es aussieht wie ein 
> Attribute, würde ich den Präfix weglassen.

Wenn ich Propertys verwende, um auf ein Attribut
zuzugreifen, verwende ich innerhalb der Klasse für das
Attribut normalerweise `_attribut`. Wenn man `property` als
Dekorator benutzt, muss man keine besonderen Namen für die
Getter/Setter-Methoden auswählen:

  class MeineKlasse(object):

      ...

      @property
      def attribut(self):
          return ...

      @attribut.setter
      def attribut(self, value):
          ...

      @attribut.deleter
      def attribut(self):
          ...

(siehe auch das Beispiel am Ende der Beschreibung von
`property`:
https://docs.python.org/3.4/library/functions.html#property )

> Ich schätze das man meist beim schreiben der Property den "internen" 
> get-Namen der Funkton nach außen als Attributsnamen übernimmt.
> Statt "get_something" wäre auch ein Name wie "return_something()" und 
> ähnliches möglich. Da sehe ich auch am Namen das was passiert. Wobei das 
> dann schon wieder eher für eine Funktion als ein Attribute/Property 
> spricht...

Für mich ist ein Getter als Methode quasi "synonym" zu einer
Property, quasi eine Property mit Klammern dran. Ich denke,
das ist der Grund dafür, dass ich das Weglassen von `get_`
als ziemlich natürlich empfinde. Anders gesagt, wenn ich
eine Methode statt einer Property haben möchte, die `x`
zurückliefert, nenne ich die Methode `x`, nicht `get_x`.

Interessanterweise bin ich erst vor einigen Tagen auf eine
Situation gestoßen, wo das knifflig ist/wäre. Eine Methode
sollte eine "store value" (ohne jetzt darauf einzugehen, was
damit in dem Kontext gemeint ist) zurückliefern. Aber wenn
man die Methode `store_value` nennt, würden wohl die meisten
Leser erst mal annehmen, dass hier eine "value" gespeichert
wird ("store a value" statt "return a store value"). Solche
missverständlichen Sonderfälle sind aber vermutlich sehr
selten. (Ich habe das Problem dadurch "lösen" können, dass
ich die Methode wieder gelöscht habe, nachdem ich gesehen
habe, dass es schon eine andere API gab, um praktisch das
gleiche zu tun. :-) )

> Ich selbst benutze Properties wie Attribute. So wie in der 
> Python-Dokumentation zu Properties[2] beschrieben. Das impliziert das es 
> ein 'get' oder 'set' gibt, und braucht meiner Ansicht nach nicht im 
> Namen zu stehen.

Ich denke, da stimmen wir überein. :-)

> Übrigens, wenn man in der Python-Dokumentation nach "get_" sucht, erhält 
> man überraschenderweise 253 Suchergebnisse.[3]

Mich wundert das gar nicht so sehr. :) Viele Module sind
noch von Konventionen aus Java oder anderen
Programmiersprachen beeinflusst, zum Beispiel `unittest`
oder die alte API von `threading`. Bei `asyncio` war ich
aber auch überrascht, da das ja recht neu ist.

Schöne Pfingsten allerseits! :-)

Viele Grüße
Stefan



Mehr Informationen über die Mailingliste Python-Leipzig