Une autre façon d'étendre (c'est-à-dire d'ajouter de nouvelles méthodes, et non de modifier les méthodes existantes) des classes, même celles qui sont intégrées, consiste à utiliser un préprocesseur qui ajoute la possibilité d'étendre hors du champ d'application de Python lui-même, en convertissant l'extension en syntaxe Python normale avant que Python ne la voie.
Je l'ai fait pour étendre la fonctionnalité de Python 2 str()
par exemple. str()
est une cible particulièrement intéressante en raison de son lien implicite avec des données cotées telles que 'this'
y 'that'
.
Voici un exemple de code étendu, où la seule syntaxe non-Python ajoutée est la fonction 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
Après quoi je peux écrire dans le code fourni au préprocesseur :
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'
Le préprocesseur mange cela, crache du Python normal sans monkeypatching, et Python fait ce que je voulais qu'il fasse.
De même qu'un préprocesseur c ajoute des fonctionnalités à c, un préprocesseur Python peut également ajouter des fonctionnalités à Python.
L'implémentation de mon préprocesseur est trop importante pour une réponse par débordement de pile, mais pour ceux qui seraient intéressés, c'est aquí sur GitHub.