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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top