Validieren Python Argumente in Subklassen
-
20-08-2019 - |
Frage
Ich versuche, ein paar Python Argumente zu validieren. Bis wir die neue statische Typisierung in Python 3.0, bekommen, was ist der beste Weg, um darüber zu gehen.
Hier ist ein Beispiel dafür, was ich versuche:
class A(object):
@accepts(int, int, int)
def __init__(a, b, c):
pass
class B(A):
@accepts(int, int, int, int)
def __init__(a, b, c, d):
A.__init__(a, b, c)
Wie Sie der Dekorateur schön sehen kann, ist die Typprüfung der Eingaben in meiner Klasse durchführen, aber ich habe alle Argumente in die zweite Klasse zu definieren, die sehr böse wird, wenn ich mehrere Ebenen der Vererbung haben. Ich kann mit einigem Erfolg verwenden kwargs, aber es ist nicht ganz so schön wie der obige Ansatz für die Typprüfung.
Im Grunde möchte ich ein Argument aus der kwargs Liste Pop und überprüfen Sie es Art ist, dann den Rest übergeben, um es Eltern, sondern tun dies in einer sehr flexiblen und saubere Art und Weise, wie diese skaliert werden kann.
Irgendwelche Vorschläge?
Lösung
Warum nicht einfach einen any
Wert, definieren und die Unterklasse Konstruktor mit @accepts(any, any, any, int)
dekorieren? Ihr Dekorateur nicht Parameter überprüfen mit any
markiert und die @accepts
auf dem Oberklassenkonstruktors überprüfen alle Argumente, um es von den Unterklassen weitergegeben werden.
Andere Tipps
Sie möchten vielleicht mit dem inspect
Modul spielen, um. Es wird Ihnen Super, Argument-Listen und andere lustige Sachen aufzählen. Es scheint, dass Sie die Argumentliste der Superklasse __init__
Methode untersuchen möchten und vergleichen Sie sie gegen das, was Sie in der Unterklasse haben. Ich bin mir nicht sicher, ob dies für Sie arbeiten wird oder nicht.
Ich würde vorsichtig sein, was Annahmen Sie aber machen. Es ist vielleicht nicht sicher sein, das zu übernehmen, nur weil die Klasse A hat N Argumente __init__
wird Subklassen mindestens N Argumente enthalten und die ersten Durchgang N bis zu der Superklasse. Wenn die Unterklasse spezifischer ist, dann könnte es in allen von 2 der Argumente zu ihrer Ober __init__
Methode füllen.