[Python-de] Link zu python-ideas "Control Flow - Never Executed Loop Body"

Stefan Schwarzer sschwarzer at sschwarzer.net
Sa Apr 9 03:33:43 EDT 2016


On 2016-04-07 15:52, Thomas Güttler wrote:
> Link zu python-ideas "Control Flow - Never Executed Loop Body"
> 
> https://groups.google.com/d/msg/python-ideas/RPAaSTN0Avw/FUneVrpZIwAJ

Thomas, vielen Dank! :-)

Ich habe mir das mal durchgelesen. Als wichtige Erkenntnisse
bleiben:

- Es ist nicht _allgemein_ möglich, in ein Iterable
  "hineinzusehen", um festzustellen, ob es leer ist. Dazu
  muss man den Iterator nach dem ersten Wert fragen. Wenn
  man das in einer Hilfs-Funktion "versteckt", kann das zu
  unangenehmen Überraschungen führen.

- Der Ansatz mit Sentinel,

  item = sentinel = object()
  for item in iterable:
      ...
  if item is sentinel:
      ...

  wird mitunter als deutlich schwerer verständlich angesehen
  als eine Variante mit explizitem Flag:

  has_items = False
  for item in iterable:
      has_items = True
      ...
  if has_items:
      ...

Mir ist zum Sentinel-Ansatz noch eine Variante eingefallen,
die den Code hoffentlich verständlicher macht. Genauso, wie
man ein Flag nicht `flag` nennt, sondern zum Beispiel
`is_valid` oder `has_items`, kann und sollte man auch einen
spezielleren Namen als `sentinel` verwenden. Mein Vorschlag:

   item = unset = object()
   for item in iterable:
       ...
   if item is unset:
       ...

Das ist meines Erachtens schöner "ausführbarer Pseudocode". :-)

Viele Grüße
Stefan


Mehr Informationen über die Mailingliste python-de