2017-10-15 5 views
0

Aktuell a set of functions gibt success=True oder False zurück.Erstellen eines Rückgabe-Flag-Objekts

Wir haben festgestellt, dass dies nicht gut genug ist, da False sowohl "gültiges Ergebnis" als auch "ungültiges Ergebnis" vermitteln kann, und wir möchten, dass sich das Verhalten in jedem Fall unterscheidet.

So I think they should be changed stattdessen {True, False, InvalidResult} zurückgeben, wobei bool(InvalidResult) für Abwärtskompatibilität falsch ist, aber für die Verwendung if is InvalidResult getestet werden kann.

Ich bin nicht sicher, was die Terminologie ist, aber ich stelle mir etwas wie die built-in NotImplemented vor, die von Vergleichsfunktionen zurückgegeben wird. Dies wird in der Dokumentation als "spezieller Wert" bezeichnet und ist vom Typ NotImplementedType.

Wie erstellt man ein solches Objekt und welche Methoden/Attribute soll es haben? Ich sollte meinen eigenen Typ wie NotImplementedType auch erstellen, oder gibt es einen vorhandenen Typ, der dieses "Flag" -Konzept vermittelt? Es ist eine ähnliche Art von Objekt zu True, False, None, NotImplemented usw.

+1

Klingt wie ein „tribool“ ... Ist 'None' auch ein gültiger Wert oder die verwendet werden könnten, kein Ergebnis zu bedeuten? –

+0

Kannst du einfach keine verwenden? bool (None) == False – georgexsh

+0

@georgexsh Ja, aber es wurde angenommen, dass InvalidResult klarer ist – endolith

Antwort

1

Sie haben soeben None oder 0 als InvalidResult Wert verwenden könnten, z.B. in my_mod, definieren InvalidResult = None, dann woanders können Sie if result is my_mod.InvalidResult testen. Sehen Sie hier für weitere Informationen über die "Wahrhaftigkeit" von None: False or None vs. None or False

Oder Sie könnten ein Objekt mit geeigneten Methoden für Boolean Umwandlung definieren; hoffentlich werden andere mit diesen Details spielen.

Beachten Sie, dass je nachdem, welche Art und Weise Sie gehen, werden Sie müssen vorsichtig sein, wenn Sie mehrt Boolesche Ausdrücke haben: InvalidResult and False geben InvalidResult aber False and InvalidResult wird False geben.

1

Offenbar ist dies eine "sentinel" genannt und ist ein einfach:

class InvalidResultType(object): 
    """ 
    Indicates that minimization has failed and result is invalid (such as a 
    boundary or constraint violation) 
    """ 
    def __repr__(self): 
     return 'InvalidResult' 
    def __bool__(self): 
     return False 
    def __reduce__(self): 
     return 'InvalidResult' 

InvalidResult = InvalidResultType() 


success = InvalidResult 

assert success == InvalidResult 
assert success is InvalidResult 
assert not bool(InvalidResult) 
assert InvalidResult != True 
assert InvalidResult != False # Not sure about this yet 
assert InvalidResult != None 

Jetzt ich natürlich die ähnlichen Fragen finden:

Defining my own None-like Python constant

und die __reduce__ Macht Übertreibend sein; Ich bin mir nicht sicher, ob Beizen oder Kopieren jemals Materie

How to create a second None in Python? Making a singleton object where the id is always the same