Pas tous les types ont une telle valeur pour commencer avec. D'autres peuvent avoir beaucoup de ces valeurs. La plus correcte de le faire serait de créer un type de la valeur dict, parce que vous pouvez vérifier si un type donné est dans le dict à tous, et vous pourriez choisir la valeur est correcte s'il y a plusieurs options. L'inconvénient est bien sûr que vous devez en quelque sorte de s'inscrire à chaque type vous intéressait.
Alternativement, vous pouvez écrire une fonction à l'aide de quelques heuristiques. Si vous avez été très prudent sur ce que vous avez passé dans la fonction, il serait probablement d'une utilisation limitée. Par exemple, tous les cas de vous montrer à l'exception de complex
sont des conteneurs généraliser avec cls()
.
complex
fonctionne réellement comme ça aussi, mais je le mentionne séparément car, int
et float
ne le font pas. Donc, si votre tentative avec le constructeur vide échoue en retournant un truthy objet ou d'élever un TypeError
, vous pouvez essayer d' cls(0)
. Et ainsi de suite et ainsi de suite...
Mise à jour
@juanpa.arrivillaga la réponse de fait suggère une astucieuse solution qui fonctionne pour la plupart des classes. Vous pouvez étendre la classe et la force de créer une instance qui sera falsy mais sinon identique à la classe d'origine. Vous devez faire cela en étendant parce que dsous méthodes comme __bool__
ne sont jamais penchés sur la classe, jamais sur une instance. Il existe de nombreux types là où de telles méthodes ne peuvent pas être remplacés sur l'instance pour commencer. Comme @Aran-Fey est désormais supprimé le commentaire de points, vous pouvez les appeler de manière sélective object.__new__
ou t.__new__
, selon si vous êtes confronté à un cas très particulier (comme int
) ou pas:
def f(t):
class tx(t):
def __bool__(self):
return False
try:
return object.__new__(tx)
except TypeError:
return tx.__new__(tx)
Cela ne fonctionne que pour 99,9% des classes que vous rencontrerez jamais. Il est possible de créer un artificiel de cas qui soulève TypeError
lorsqu'il est passé à l' object.__new__
comme int
n', et ne permettent pas un no-arg version de t.__new__
, mais je doute que vous trouverez jamais une telle chose dans la nature. Voir le gist @Aran-Fey a fait pour le démontrer.