PyPy erfindet nebenbei geile Syntax · Apr 3, 12:48 von stargaming
Das PyPy 1.0 draußen ist, dürfte ja mittlerweise die Runde gemacht haben (Jacob Hallen zu PyPy).
Jedenfalls ist mir beim Durchstöbern der Bibliotheken dort etwas Spaßiges aufgefallen:
python:
- class __extend__(IrgendeineAndereKlasse):
- def angehangeneMethode(self):
- ...
Das Ganze geht zurück auf eine sehr schöne Metaklasse (die auf IrgendeineAndereKlasse angewendet werden muss):
python:
- """
- class X:
- __metaclass__ = extendabletype
- ...
- # in some other file...
- class __extend__(X):
- ... # and here you can add new methods and class attributes to X
- """
- class extendabletype(type):
- """A type with a syntax trick: 'class __extend__(t)' actually extends
- the definition of 't' instead of creating a new subclass."""
- def __new__(cls, name, bases, dict):
- if name == '__extend__':
- for cls in bases:
- for key, value in dict.items():
- if key == '__module__':
- continue
- setattr(cls, key, value)
- return None
- else:
- return super(extendabletype, cls).__new__(cls, name, bases, dict)
Was es erlaubt, Klassen in anderen Dateien als der Deklarationsdatei zu “erweitern” (ja, es ginge auch über die Zuweisung Klasse.methode = ..., ist aber lange nicht so schön).
Speziell kommt das aus der Datei pypy/tool: pairtype.py.

