2017-10-15 15 views
0

Actuellement a set of functions retours success=True ou False.Comment créer un objet de drapeau de retour

Nous avons découvert que ce n'est pas assez bon, car False peut transmettre à la fois "résultat valide" ou "résultat invalide", et nous voulons que le comportement diffère dans chaque cas.

So I think they should be changed pour revenir à la place {True, False, InvalidResult}, où bool(InvalidResult) est faux pour la compatibilité descendante, mais peuvent être testés pour l'utilisation if is InvalidResult.

Je ne suis pas sûr de ce que la terminologie est, mais j'imagine quelque chose comme le built-in NotImplemented qui est retourné par les fonctions de comparaison. On appelle cela une « valeur spéciale » dans la documentation et est de type NotImplementedType.

Comment créer un tel objet et quelles méthodes/attributs doit-il avoir? Je crée mon propre type comme NotImplementedType aussi, ou est-il un type existant qui véhicule ce concept « drapeau »? Il est une sorte d'objet similaire à True, False, None, NotImplemented, etc.

+1

Sonne comme un « tribool » ... Est-ce 'none' aussi une valeur valide ou pourrait-il être utilisé pour signifier aucun résultat? –

+0

ne pouvez-vous pas utiliser Aucun? bool (Aucun) == Faux – georgexsh

+0

@georgexsh Oui, mais on pensait que InvalidResult est plus clair – endolith

Répondre

1

Vous pouvez simplement utiliser None ou 0 comme la valeur InvalidResult, par exemple en my_mod, définir InvalidResult = None, puis ailleurs, vous pouvez tester if result is my_mod.InvalidResult. Voir ici pour plus d'informations sur la "véracité" de None: False or None vs. None or False

Ou vous pouvez définir un objet avec des méthodes appropriées pour la conversion booléenne; j'espère que d'autres entreront dans ces détails.

Notez que la façon que vous alliez, vous devrez être prudent si vous avez multipart expressions booléennes: InvalidResult and False donnera InvalidResult mais False and InvalidResult donnera False.

1

Apparemment, on appelle cela un "sentinel" et est une simple que cela:

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 

maintenant bien sûr, je trouve les questions similaires:

Defining my own None-like Python constant

et la __reduce__ pourrait être exagéré; Je ne sais pas si le décapage ou la copie ne sera jamais question

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