2017-10-11 28 views
1

Ich möchte einen Baum Node Klasse schreiben, mit Node Kinder, mit attrs, mit Validierung.In Attrs, validieren Sie einen Attributtyp ist der umschließenden Klasse

Die folgende nicht kompilieren, weil Node noch nicht existiert -

from attr import attrs, attrib 
from attr.validators import instance_of 

@attrs 
class Node: 
    left = attrib(validator=instance_of(Node)) 
    right = attrib(validator=instance_of(Node)) 

Irgendwelche Vorschläge, wie mein gewünschtes Verhalten zu bekommen?

Danke!

+1

Keine Lösung, aber willst du nicht in der Lage sein, die Attribute auf None zu setzen? – user2357112

Antwort

1

Sie können eine Dummy-Node Klasse erstellen (nennen wir dieses Objekt A), so dass es ein eingetragener Name ist NameError zu vermeiden, und dann können Sie Ihre normale Klasse erstellen, um sicherzustellen, von dem Dummy eines erben (nennen das Objekt B).

Technisch wurde der Name für Objekt A überschrieben, aber ein Verweis darauf wird immer noch beibehalten. Also, wenn Sie Node() aufrufen, arbeiten Sie tatsächlich mit einem Objekt B. Dies ist sowohl von Typ Objekt A und Objekt B, aber der Typ, der in instance_of() überprüft wird, ist streng Objekt A. Das ist für uns in Ordnung, erklärt aber warum Vererbung ist wichtig.

class Node: 
    pass 

# This won't work because every `Node` we initialise will be strictly object B, 
# but the validator requires a type of object A 
@attrs 
class Node: 
    left = ... 

Da einige Knoten zwangsläufig Blätter sein müssen, haben Sie auch NoneType für left und right sein zu ermöglichen. Wenn Sie einen Standardwert angeben, können Sie einen Knoten als Node() anstelle von Node(None, None) initialisieren. Zum Beispiel

>>> tree = Node(right=Node(Node())) 
>>> tree 
Node(left=None, right=Node(left=Node(left=None, right=None), right=None)) 
Verwandte Themen