Convalida degli argomenti Python nelle sottoclassi
-
20-08-2019 - |
Domanda
Sto provando a convalidare alcuni argomenti di Python. Fino a quando non avremo la nuova tipizzazione statica in Python 3.0, qual è il modo migliore per farlo.
Ecco un esempio di ciò che sto tentando:
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)
Come puoi vedere, il decoratore sta ben eseguendo il controllo del tipo degli input della mia classe, ma devo definire tutti gli argomenti per la seconda classe, che diventa molto sgradevole quando ho più livelli di eredità. Posso usare kwargs con un certo successo, ma non è così bello come l'approccio sopra per il controllo del tipo.
Fondamentalmente voglio estrarre un argomento dall'elenco di kwargs e controllare il suo tipo, quindi passare il resto al suo genitore, ma farlo in modo molto flessibile e pulito come ridimensiona.
Qualche suggerimento?
Soluzione
Perché non definire semplicemente un any
valore e decorare il costruttore della sottoclasse con @accepts(any, any, any, int)
? Il decoratore non controllerà i parametri contrassegnati con @accepts
e il <=> sul costruttore della superclasse controllerà tutti gli argomenti trasmessi ad esso dalle sottoclassi.
Altri suggerimenti
Potresti voler giocare con il modulo inspect
. Ti consentirà di enumerare superclassi, elenchi di argomenti e altre cose divertenti. Sembra che potresti voler esaminare l'elenco degli argomenti del metodo superclasse __init__
e confrontarlo con quello che hai nella sottoclasse. Non sono sicuro che funzionerà o meno per te.
Starei attento a quali ipotesi fai comunque. Potrebbe non essere sicuro supporre che solo perché la classe A ha N argomenti su <=>, le sottoclassi conterranno almeno N e passeranno i primi N fino alla super classe. Se la sottoclasse è più specifica, allora potrebbe riempire tutto di 2 degli argomenti nel suo metodo <=> superclassi.