Slide 1

Slide 1 text

Praktische Anwendung von Metaklassen Mirko Dziadzka http://mirko.dziadzka.de/ @MirkoDziadzka PyCon DE 2012 1 / 44

Slide 2

Slide 2 text

Wer bin ich Wer bin ich? Bewege mich mit Softwareentwicklung auf dem Gebiet Unix, Netzwerk, Security Benutze Python seit ca. 1995 ... in Projekten mit > 100 000 LOC Zur Zeit bei Riverbed Technology in Regensburg 2 / 44

Slide 3

Slide 3 text

Wer bin ich Wer bin ich? Bewege mich mit Softwareentwicklung auf dem Gebiet Unix, Netzwerk, Security Benutze Python seit ca. 1995 ... in Projekten mit > 100 000 LOC Zur Zeit bei Riverbed Technology in Regensburg 3 / 44

Slide 4

Slide 4 text

Wer bin ich Wer bin ich? Bewege mich mit Softwareentwicklung auf dem Gebiet Unix, Netzwerk, Security Benutze Python seit ca. 1995 ... in Projekten mit > 100 000 LOC Zur Zeit bei Riverbed Technology in Regensburg 4 / 44

Slide 5

Slide 5 text

Wer bin ich Wer bin ich? Bewege mich mit Softwareentwicklung auf dem Gebiet Unix, Netzwerk, Security Benutze Python seit ca. 1995 ... in Projekten mit > 100 000 LOC Zur Zeit bei Riverbed Technology in Regensburg 5 / 44

Slide 6

Slide 6 text

Wer bin ich Wer bin ich? Bewege mich mit Softwareentwicklung auf dem Gebiet Unix, Netzwerk, Security Benutze Python seit ca. 1995 ... in Projekten mit > 100 000 LOC Zur Zeit bei Riverbed Technology in Regensburg 6 / 44

Slide 7

Slide 7 text

Wer seid ihr? Wer seid ihr? Wer weiss, was Metaklassen sind? Wer schon mal welche benutzt? Wer benutzt Dekoratoren? Wer benutzt Klassen Dekoratoren? 7 / 44

Slide 8

Slide 8 text

Wer seid ihr? Wer seid ihr? Wer weiss, was Metaklassen sind? Wer schon mal welche benutzt? Wer benutzt Dekoratoren? Wer benutzt Klassen Dekoratoren? 8 / 44

Slide 9

Slide 9 text

Wer seid ihr? Wer seid ihr? Wer weiss, was Metaklassen sind? Wer schon mal welche benutzt? Wer benutzt Dekoratoren? Wer benutzt Klassen Dekoratoren? 9 / 44

Slide 10

Slide 10 text

Wer seid ihr? Wer seid ihr? Wer weiss, was Metaklassen sind? Wer schon mal welche benutzt? Wer benutzt Dekoratoren? Wer benutzt Klassen Dekoratoren? 10 / 44

Slide 11

Slide 11 text

Wer seid ihr? Wer seid ihr? Wer weiss, was Metaklassen sind? Wer schon mal welche benutzt? Wer benutzt Dekoratoren? Wer benutzt Klassen Dekoratoren? 11 / 44

Slide 12

Slide 12 text

Was sind Metaklassen? 12 / 44

Slide 13

Slide 13 text

Was sind Metaklassen Was sind Metaklassen? Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder whether you need them, you don’t (the people who actually need them know with certainty that they need them, and don’t need an explanation about why). – Python Guru Tim Peters 13 / 44

Slide 14

Slide 14 text

Was sind Metaklassen Was sind Metaklassen? Ich glaube, es ist nicht ganz so schlimm ... 99% Prozent brauchen keine Metaklassen, sie k¨ onnen aber helfen, Probleme auf einfachere Art zu l¨ osen 14 / 44

Slide 15

Slide 15 text

Was sind Metaklassen Was sind Metaklassen? Ich glaube, es ist nicht ganz so schlimm ... 99% Prozent brauchen keine Metaklassen, sie k¨ onnen aber helfen, Probleme auf einfachere Art zu l¨ osen 15 / 44

Slide 16

Slide 16 text

Was sind Metaklassen Was sind Metaklassen? Ich glaube, es ist nicht ganz so schlimm ... 99% Prozent brauchen keine Metaklassen, sie k¨ onnen aber helfen, Probleme auf einfachere Art zu l¨ osen 16 / 44

Slide 17

Slide 17 text

Was sind Metaklassen Also ... was sind Metaklassen? Klassen in Python sind auch nur Objekte also Instanz einer Klasse Die Klasse von Klassen ist ‘type’ 17 / 44

Slide 18

Slide 18 text

Was sind Metaklassen Also ... was sind Metaklassen? Klassen in Python sind auch nur Objekte also Instanz einer Klasse Die Klasse von Klassen ist ‘type’ 18 / 44

Slide 19

Slide 19 text

Was sind Metaklassen Also ... was sind Metaklassen? Klassen in Python sind auch nur Objekte also Instanz einer Klasse Die Klasse von Klassen ist ‘type’ 19 / 44

Slide 20

Slide 20 text

Was sind Metaklassen Also ... was sind Metaklassen? Klassen in Python sind auch nur Objekte also Instanz einer Klasse Die Klasse von Klassen ist ‘type’ 20 / 44

Slide 21

Slide 21 text

Was sind Metaklassen >>> class Foo(object): ... pass >>> foo = Foo() >>> foo <__main__.Foo object at 0x1005b5b90> >>> foo.__class__ >>> foo.__class__.__class__ 21 / 44

Slide 22

Slide 22 text

Was sind Metaklassen Die Klasse einer Benutzerdefinierten Klasse ist also type Wenn eine Klasse auch nur die Instanz einer anderen (Meta-)Klasse ist, so kann ich auch die Metaklasse benutzen, um eine Klasse zu erzeugen. 22 / 44

Slide 23

Slide 23 text

# define a class the ’normal’ way class Foo: default = 42 def get_answer(self): return self.default # define a class as object from type ’type’ def _Bar_get_answer(self): return self.default Bar = type(’Bar’, (), { ’default’ : 42, ’get_answer’ : _Bar_get_answer, }) 23 / 44

Slide 24

Slide 24 text

Was sind Metaklassen uns das ist auch genau das, was intern passiert Python benutzt nach dem Parsen des class statements type um die Klasse zu erzeugen. Das l¨ asst sich ¨ uber das Attribute metaclass in der Klasse oder im Modul ¨ andern Es reicht, wenn metaclass in einer Basis Klasse deklariert wird Hinweis: In grossen Projekten immer alles von einer (auch gerne leeren) Basisklasse ableiten 24 / 44

Slide 25

Slide 25 text

class Foo(object): answer = 42 # ist gleichwertig zu class Foo(object): __metaclass__ = type answer = 42 # ist (fast) gleichwertig zu class MetaClass(type): pass class Foo(object): __metaclass__ = MetaClass answer = 42 25 / 44

Slide 26

Slide 26 text

Wie implementiert man eine Metaklasse Wie jede andere Klasse auch ¨ ublichwerweise definiert man die init oder die new Methode um seinen code unterzubringen. new scheint mir angebrachter, da es der fr¨ uhest m¨ ogliche Zeitpunkt ist 26 / 44

Slide 27

Slide 27 text

Wie implementiert man eine Metaklasse Wie jede andere Klasse auch ¨ ublichwerweise definiert man die init oder die new Methode um seinen code unterzubringen. new scheint mir angebrachter, da es der fr¨ uhest m¨ ogliche Zeitpunkt ist 27 / 44

Slide 28

Slide 28 text

Wie implementiert man eine Metaklasse Wie jede andere Klasse auch ¨ ublichwerweise definiert man die init oder die new Methode um seinen code unterzubringen. new scheint mir angebrachter, da es der fr¨ uhest m¨ ogliche Zeitpunkt ist 28 / 44

Slide 29

Slide 29 text

Wie implementiert man eine Metaklasse Wie jede andere Klasse auch ¨ ublichwerweise definiert man die init oder die new Methode um seinen code unterzubringen. new scheint mir angebrachter, da es der fr¨ uhest m¨ ogliche Zeitpunkt ist 29 / 44

Slide 30

Slide 30 text

class ExampleMetaClass(type): def __new__(cls, name, bases, attributes): res = type(name, bases, attributes) print ’class %s created: %s’ % (name, res) return res class Foo(object): __metaclass__ = ExampleMetaClass def __init__(self): return class Foo created: 30 / 44

Slide 31

Slide 31 text

Wie implementiert man eine Metaklasse In dieser new Methode kann man nun anfangen, die Klasse zu manipulieren ... oder zu analysieren 31 / 44

Slide 32

Slide 32 text

Wie implementiert man eine Metaklasse In dieser new Methode kann man nun anfangen, die Klasse zu manipulieren ... oder zu analysieren 32 / 44

Slide 33

Slide 33 text

Beispiele 33 / 44

Slide 34

Slide 34 text

Wo benutzt man Metaklassen Wo benutzt man Metaklassen? Typischerweise bei Implemenationen von Interfaces ORM Mapper (django) Sprachmodifikationen (schlechter Ruf?) Debugging, ... 34 / 44

Slide 35

Slide 35 text

Debugging mit Metaklassen: trace Das Problem Software wird an Kunden ausgeliefert. Falls es Probleme geben sollte, w¨ unscht sich der Entwickler ausgiebige trace Informationen. Standard L¨ osung logging.debug calls, ¨ uberall wo es sinnvoll sein k¨ onnte Grenzen der L¨ osung Debug Aufrufe “kosten” Rechenzeit Es ist nicht immer vorher klar, was sinnvoll ist Der Code wird durch debug Informationen unterbrochen und ist dadurch nicht so fl¨ ussig zu lesen 35 / 44

Slide 36

Slide 36 text

Debugging mit Metaklassen: trace Wunschl¨ osung bei Nichtbenutzung, keine Laufzeiteinfl¨ usse selektives tracen von allen Methoden aufrufen und Ergebnissen im Programm Kunde kann Problem mit eingeschaltetem Debug reproduzieren und aussagekr¨ aftige Logs an die Entwickeler schicken 36 / 44

Slide 37

Slide 37 text

Debugging mit Metaklassen: trace Idee: mittels config file / environment variable k¨ onnen beim Programmstart interessante Klassen/Methoden-namen angegeben werden eine Metaklasse dekoriert alle diese Methoden mit einem trace Dekorator 37 / 44

Slide 38

Slide 38 text

Debugging mit Metaklassen: trace class BaseMetaClass(type): def __init__(self, clsname, bases, attr): for name, value in attr.items(): if name.startswith(’__’): continue fullname = "%s.%s.%s" % ( self.__module__, clsname, name) if not should_wrap(fullname): continue value = trace_decorator(fullname, value) setattr(self, name, value) class BaseClass(object): __metaclass__ = BaseMetaClass 38 / 44

Slide 39

Slide 39 text

Debugging mit Metaklassen: trace import os import fnmatch DEBUG_TARGETS = os.environ.get(’DEBUG_TARGETS’,’’) def should_wrap(fullname): for pattern in DEBUG_TARGETS.split(’,’): if fnmatch.fnmatch(fullname, pattern): return True return False 39 / 44

Slide 40

Slide 40 text

Debugging mit Metaklassen: trace def log(message, *args): print message % args def trace_decorator(fullname, method): def wrapper(*args, **kwargs): log("%s CALL %s %s", fullname, args, kwargs) try: res = method(*args, **kwargs) log("%s RETURN %s", fullname, res) return res except Exception,e: log("%s EXCEPTION %s", fullname, str(e)) raise #... return wrapper 40 / 44

Slide 41

Slide 41 text

Debugging mit Metaklassen: trace Anwendung $ DEBUG_TARGETS= $ ./metaclass_debug_usage.py $ DEBUG_TARGETS=*.Question.* $ ./metaclass_debug_usage.py __main__.Question.set_answer CALL (<__main__.Question object at 0x102cb1ad0>, 2 __main__.Question.set_answer RETURN None 41 / 44

Slide 42

Slide 42 text

Andere Anwendungen Andere Anwendungen von Metaklassen Dynamische Code Analyse Callgraph Von wo wird auf eine Variable lesend/schreibend zugegriffen Coding Style enforcement fault injection 42 / 44

Slide 43

Slide 43 text

Weiterf¨ uhrendes Hintergrundinformationen http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python http://www.ibm.com/developerworks/linux/library/l-pymeta/index.html http://cleverdevil.org/computing/78/ Beispielcode https://github.com/MirkoDziadzka/pycon-meta Folien als PDF http://mirko.dziadzka.de/Vortrag/pycon-meta-20121030 43 / 44

Slide 44

Slide 44 text

Danke f¨ ur’s zuh¨ oren Fragen? 44 / 44