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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top