Comment dois-je vérifier qu'un argument donné est un objet datetime.date?
Je suis actuellement en utilisant un assert
déclaration avec isinstance
. Parce que datetime
est une sous-classe de date
j'ai aussi besoin de vérifier qu'elle n'est pas une instance de datetime
. Il y a certainement une meilleure façon?
from datetime import date, datetime
def some_func(arg):
assert isinstance(arg, date) and not isinstance(arg, datetime),\
'arg must be a datetime.date object'
# ...
source d'informationauteur rmh
Vous devez vous connecter pour publier un commentaire.
Je ne comprends pas votre motivation pour le rejet des instances de sous-classes (étant donné que, par définition, ils soutiennent tous le comportement de la classe mère supporte!), mais si c'est vraiment ce que vous insistez sur le fait, alors:
Ne pas utiliser
assert
sauf pour la santé mentale de vérifier au cours du développement (il se tourna vers un no-op lorsque vous exécutez avecpython -o
), et de ne pas augmenter le mauvais type d'exception (comme, uneAssertionError
lorsqu'unTypeError
est clairement ce que tu veux dire ici).À l'aide de
isinstance
et puis, à l'exclusion d'une sous-classe spécifique n'est pas une bonne façon d'obtenir un rigide type exact avec des sous-classes exclu: après tout, l'utilisateur peut parfaitement bien sous-classedatetime.date
et d'ajouter quoi que ce soit, vous êtes donc la garder pour éviter le rejet des instances dedatetime.datetime
précisément!-)Si votre problème est que le graphe va bancale parce que c'est à l'aide de fractions d'une journée, vous pouvez tester pour que, dans d'autres façons, par exemple,
hasattr(arg, 'hour')
fait la distinction entre undatetime
et une instance dedate
instance.La façon Python n'est pas pour le vérifier, il suffit d'aller de l'avant et laissez votre code faire ce qu'il doit faire, et si l'objet n'a pas une méthode requise ou quelque chose, le code suivant ne fonctionnera pas avec une exception au point où, cette méthode sera appelée. Ceci est appelé duck-typing et c'est ce qui fait de Python de manière flexible.
Maintenant, si vous avez vraiment ne peut pas accepter une
datetime.datetime
objet... eh bien, pourquoi ne pouvez-vous pas? Undatetime
peut rien faire undate
peut le faire, donc je ne peux pas imaginer qu'en soit la raison, vous auriez pour réfuter unedatetime
ou de toute sous-classe dedate
.Si vous vraiment vraiment avoir une bonne raison pour faire cela (je suppose que peut-être comme un débogage chose, mais même alors, je ne comprends pas...):