Tout ce que je veux, c'est que bool (myInstance) renvoie False (et que myInstance soit évalué à False dans un conditionnel comme si/ou/et. Je sais comment remplacer>, <, =)
J'ai essayé ça:
class test:
def __bool__(self):
return False
myInst = test()
print bool(myInst) #prints "True"
print myInst.__bool__() #prints "False"
Aucune suggestion?
(J'utilise Python 2.6)
Est-ce Python 2.x ou Python 3.x? Pour Python 2.x vous cherchez à remplacer __nonzero__
au lieu.
class test:
def __nonzero__(self):
return False
Si vous voulez garder votre code compatible avec python3, vous pouvez faire quelque chose comme ça
class test:
def __bool__(self):
return False
__nonzero__=__bool__
Si votre classe test
ressemble à une liste, définissez __len__
Et bool(myInstanceOfTest)
renverra True
s'il y a 1+ éléments (liste non vide) et False
s'il y a 0 éléments (liste vide). Cela a fonctionné pour moi.
class MinPriorityQueue(object):
def __init__(self, iterable):
self.priorityQueue = heapq.heapify(iterable)
def __len__(self):
return len(self.priorityQueue)
>>> bool(MinPriorityQueue([])
False
>>> bool(MinPriorityQueue([1,3,2])
True
Semblable à John La Rooy, j'utilise:
class Test(object):
def __bool__(self):
return False
def __nonzero__(self):
return self.__bool__()
[ceci est un commentaire à la réponse de @ john-la-rooy mais je ne peux pas encore commenter :)]
Pour la compatibilité Python3, vous pouvez le faire (je cherchais cela)
class test(object):
def __bool__(self):
return False
__nonzero__=__bool__
le seul problème est que vous devez répéter le __nonzero__ = __bool__
chaque fois que vous changez __bool__
dans les sous-classes. Autrement __nonzero__
sera conservé de la superclasse. Tu peux essayer
from builtins import object # needs to be installed !
class test(object):
def __bool__(self):
return False
__nonzero__=__bool__
qui devrait fonctionner (non confirmé) ou écrire une métaclasse :) vous-même.