Ich habe in Dortmund Informatik studiert und arbeite als Software-Entwickler bei der Firma Dicad System GmbH (CAD für das Bauwesen). Python entdeckte ich 1995 bei der Suche nach einer Alternative zu Perl als Sprache zur Entwicklung interner Tools. Nach zwei Tagen Ausprobierens war ich überzeugt und habe seitdem keine Zeile Perl mehr geschrieben ...
Beruflich programmiere ich zwar überwiegend in C++ und C# - aber wir setzen in zunehmenden Maße Python nicht nur für administrative Aufgaben sondern auch in unseren Produkten ein. Anwendungsfelder sind dabei zum Beispiel Dateiformatkonverter aber auch kundenspezifische geometrische Berechnungen - hierfür habe ich einen C++-Geometriekern mittels boost python für Python verfügbar gemacht - und sogar Optimierungsalgorithmen (Packalgorithmen, hier war der in Python geschriebene Prototyp einfach schnell genung ...).
Dekoratoren
Beim pyCologne-Treffen am 11. April 2007 habe ich einen Vortrag zum Thema Dekoratoren gehalten. Die reStructuredText-Vorlage für meine Folien ist decorators-utf8.txt, die per rst2s5.py generierte S5-Slideshow befindet sich in decorators.tgz.
Einige "Literaturhinweise":
Das "Python Enhancement Proposal" zu Dekoratoren ist PEP 318. Recht interessant zu lesen, allerdings wird etwas zu ausführlich auf Syntax-Alternativen und die Gründe ihrer Ablehnung eingegangen.
Im englischsprachigen Python Wiki findet man eine Seite mit vielen Beispielen für Dekoratoren. Nicht alle sind wirklich sinnvoll, aber Anregungen kann man sich hier holen.
Dieser sehr gute Artikel von Philip J. Eby geht auf alle Aspekte rund um Dekoratoren ein. Schade nur, dass bei den Code-Beispielen die Einrückung verloren gegangen ist.
Hier noch ein etwas brauchbarerer trace-Dekorator (im Vergleich zu dem rudimentären aus meinem Vortrag):
1 from functools import wraps
2
3 def trace(func):
4 """Trace decorator with call nesting indication (for Py 2.5).
5
6 >>> @trace
7 ... def fac(n):
8 ... if n == 1:
9 ... return 1
10 ... else:
11 ... return n * fac(n - 1)
12 ...
13 >>> fac(4)
14 ,- fac(4)
15 |,- fac(3)
16 ||,- fac(2)
17 |||,- fac(1)
18 |||`- 1
19 ||`- 2
20 |`- 6
21 `- 24
22 24
23 """
24 @wraps(func)
25 def wrapper(*args, **kw):
26 bars = "|" * trace.nesting
27 args_repr = [repr(arg) for arg in args]
28 args_repr.extend("%s=%r" % arg for arg in kw.iteritems())
29 print "%s,- %s(%s)" % (
30 bars, func.__name__, ", ".join(args_repr))
31 trace.nesting += 1
32 try:
33 result = func(*args, **kw)
34 finally:
35 trace.nesting -= 1
36 print bars + "`-", repr(result)
37 return result
38 return wrapper
39 trace.nesting = 0