Alboh Blog

AB

Python idioms Präsentation

Der Londoner Safe Hammad hat die Slides seiner Präsentation Python Idioms bereitgestellt und damit eine kontroverse Diskussion auf HackerNews hervorgerufen.

Dabei sollten wir zuerst klären: Was sind Idiome?

Idiome (Muster) sind einfache Aufgaben, Algorithmen oder Datenstrukturen, die nicht durch die verwendete Programmiersprache bereitsgestellt werden, oder wenn bereitgestellt, besonders hervorzuheben oder unüblich im Gebrauch sind1. Man könnte Idiom auch als Standardverfahren2 bezeichnen, die sich aus den Möglichkeiten3 einer Programmiersprache ergeben haben.

Beispiel

Um den Wert zweier Variablen zu tauschen, kann das folgende Idiom verwendet werden:

1
2
3
temp = a
a = b
b = temp

Die dabei entstandene Variable temp könnte vermieden werden, in dem man die Variablen als Tupel schreibt.

1
b, a = a, b

Dabei erzeugt das Komma die Konstruktion eines Tupels, welches dann in die Variablen des linken Tupels entpackt wird.

Idiome

Since large programs grow from small ones, it is crucial that we develop an arsenal of standard program structures of whose correctness we have become sure — we call them idioms — and learn to combine them into larger structures using organizational techniques of proven value.

Alan Perlis

Wie das Zitat von Alan Perlis impliziert, liegt die Qualität eines Idioms in seiner Reife, die es durch Diskussionen und Optimierungen, denen es unterworfen wurde, erreicht hat. Zum Beispiel wirbt Safe Hammad in seiner Präsentation für die Prüfung von Variablen ohne Bezug auf Datentypen, Werte oder Eigenschaften, da diese eine Ablenkung darstellen und nicht zwingend erforderlich sind. Zur Verdeutlichung ist die folgende implizite Prüfung aufgeführt:

1
2
3
4
5
6
name = 'Safe'
pets = ['Dog', 'Cat', 'Hamster']
owners = {'Safe': 'Cat', 'George': 'Dog'}

if name and pets and owners:
    print('We have pets!')

Das Gegenstück dazu:

1
2
if name != '' and len(pets) > 0 and owners != {}:
    print('We have pets!')

Nun stellen sich einige die Frage4, ob es nicht besser sei explizit zu testen und lieber eine exception zu erzeugen, als einen impliziten Test durchzuführen. Die Annahme, die dieser Behauptung zugrunde liegt, ist das mystring = None nicht durch die Prüfung von mystring != '' Ermittelt werden kann. Wenn jedoch eine Prüfung über len(mystring) == 0 durchgeführt würde, der TypeError den ungewollten Wert der Variable offenlegt. Dies zeigt, dass die Verwendung des Idioms abhängig vom Vorhaben des Entwicklers und der Situation ist.

Ein weiteres Idiom ist die Verwendung von in bei lists, sets, dicts, strings und Objekten mit einer __contains__-Methode. Dabei ist if 'H' in name eindeutiger und kürzer als if name.find('H') != -1. Auch die Iteration über eine Liste sollte kurz und knappgehalten werden, in dem for pet in pets einer while i < len(pets) vorgezogen werden soll.

Wenn bei der Iteration über eine Liste noch den Index benötigt wird, kann über enumerate ein Tupel erzeugt werden, dass den aktuellen Index und Wert beinhaltet5.

Etwas anspruchsvoller aber um so nützlicher ist das Idiom zum Erzeugen von Listen mithilfe einer Bedingung.

1
2
3
4
data = [7, 20, 3, 15, 11]
# [ expression for item in list if conditional ]
result = [i * 3 for i in data if i > 10]
print(result)   # [60, 45, 33]

Zuerst wird geprüft, welche Elemente erfüllen die Bedingung i > 10, danach wird der Ausdruck angewendet und der Rückgabewert in die Liste result aufgenommen. Ein besseres Beispiel findet sich bei pythonforbeginners.com. Dort wird gezeigt, wie mithilfe der ‘List Comprehensions’ alle Zahlen aus einem String ermitteln werden können.

1
2
3
string = "Hello 12345 World"
numbers = [x for x in string if x.isdigit()]
print numbers # ['1', '2', '3', '4', '5']

Das Letzte ist eher ein ‘no-brainer’, da gilt es mithilfe von zip und dict aus zwei Listen ein Dict zu erstellen.

1
2
3
4
keys = ['Safe', 'Bob', 'Thomas']
values = ['Hammad', 'Builder', 'Engine']
d = dict(zip(keys, values))
print(d)  # {'Bob': 'Builder','Safe': 'Hammad','Thomas': 'Engine'}

Die restlichen Beispiele sind definitiv einen Blick Wert und wenn ihr Zeit habt, schaut sie euch mal genauer an. Ihr findet sie unter safehammad.com/presentations.


Comments