Innym sposobem na rozszerzenie (w szczególności dodanie nowych metod, a nie zmianę istniejących) klas, nawet wbudowanych, jest użycie preprocesora, który dodaje możliwość rozszerzenia poza zakres samego Pythona, konwertując rozszerzenie normalna składnia Pythona, zanim Python faktycznie ją zobaczy.
Zrobiłem to na przykład, aby rozszerzyć str()
klasę Pythona 2 . str()
jest szczególnie interesującym celem ze względu na niejawne powiązanie z cytowanymi danymi, takimi jak 'this'
i 'that'
.
Oto fragment kodu rozszerzającego, w którym jedyną dodaną składnią inną niż Python jest extend:testDottedQuad
bit:
extend:testDottedQuad
def testDottedQuad(strObject):
if not isinstance(strObject, basestring): return False
listStrings = strObject.split('.')
if len(listStrings) != 4: return False
for strNum in listStrings:
try: val = int(strNum)
except: return False
if val < 0: return False
if val > 255: return False
return True
Po czym mogę napisać w kodzie podanym do preprocesora:
if '192.168.1.100'.testDottedQuad():
doSomething()
dq = '216.126.621.5'
if not dq.testDottedQuad():
throwWarning();
dqt = ''.join(['127','.','0','.','0','.','1']).testDottedQuad()
if dqt:
print 'well, that was fun'
Preprocesor to zjada, wypluwa normalny Python bez monkeypatchingu, a Python robi to, co zamierzałem.
Tak jak preprocesor ac dodaje funkcjonalność do c, tak preprocesor Pythona może dodawać funkcje do Pythona.
Moja implementacja preprocesora jest zbyt duża, aby odpowiedzieć na przepełnienie stosu, ale dla tych, którzy mogą być zainteresowani, jest tutaj na GitHub.