2013-04-22 14 views
28

Próbowałem kilka oczywistych opcji, ale żaden z nich nie działa:Python: jak mogę sprawdzić, czy obiekt jest typu datetime.date?

In [150]: x 
Out[150]: datetime.date(2012, 9, 1) 

In [151]: type(x) 
Out[151]: datetime.date 

In [152]: isinstance(x, datetime.date) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-152-9a298ea6fce5> in <module>() 
----> 1 isinstance(x, datetime.date) 

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types 

In [153]: x is datetime.date 
Out[153]: False 

In [154]: type(x) is datetime.date 
Out[154]: False 

Jaki jest właściwy sposób to zrobić?

+3

Czy możesz wyprodukować [SSCCE] (http://sscce.org)? Myślę, że wystarczyłby program cztero- lub pięcioliniowy. Ja [nie mogę odtworzyć wyników] (http://ideone.com/gqdou2) z tego, co już opublikowałeś. –

+1

Jakiej wersji Python używasz? Dla Python-2.6 'isinstance (x, datetime.date) działa poprawnie tak jak" type (x) to datetime.date " – RedBaron

+0

Którą wersję Pythona używasz i co zrobiłeś, aby wygenerować' x'? –

Odpowiedz

55

wierzę przyczyną tego, że nie pracuje w swoim przykładem jest to, że zostały przywiezione datetime tak:

from datetime import datetime 

to prowadzi do błędu widać

In [30]: isinstance(x, datetime.date) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
/<ipython-input-30-9a298ea6fce5> in <module>() 
----> 1 isinstance(x, datetime.date) 

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types 

jeśli ciebie po prostu zaimportuj w ten sposób:

import datetime 

kod będzie eksploatowany w sposób pokazany na wszystkich innych odpowiedzi

In [31]: import datetime 

In [32]: isinstance(x, datetime.date) 
Out[32]: True 

In [33]: 
+3

+1 ładna robota detektywistyczna. –

+1

Jeśli masz datetime (zamiast tylko datę), przez rozszerzenie możesz zrobić: 'x = datetime.datetime.now()' then 'isinstance (x, datetime.datetime)' – fantabolous

+4

Cóż, jeśli chcesz Aby odróżnić datetime.date i datetime.datetime, ta metoda zakończy się niepowodzeniem: '>>> import datetime' ' >>> foo = datetime.datetime.now() ' ' >>> isinstance (foo, datetime.date) '' true' .__ class__ powinno pomóc '>>> foo .__ class__ == datetime.date' ' 'FALSE >>> foo .__ class__ == datetime.datetime' ' true' – BernarditoLuis

7

właściwa droga jest

import datetime 
isinstance(x, datetime.date) 

Kiedy próbuję to na moim komputerze działa prawidłowo. Musisz sprawdzić, dlaczego datetime.date nie jest klasą. Czy może zamaskowałeś to czymś innym? lub nie odnosisz się do niego poprawnie dla twojego importu?

+0

Przykład w pytaniu pokazuje, że to nie działa. Czy masz wyjaśnienie tego? –

+1

Rozwiązanie cmd zwraca również wartość True, jeśli x jest datetime.datetime. To może nie być to, czego chcesz lub czego oczekujesz. Odpowiedź Simona Steinbergera odpowiednio rozróżnia między datetime.date a datetime.datetime. – Chuck

+0

@cmd W python 2.7 instrukcja "isinstance (datetime.datetime.now(), datetime.date)" zwraca True. – Chuck

3
import datetime 
d = datetime.date(2012, 9, 1) 
print type(d) is datetime.date 

> True 
+1

Użycie 'jest' zamiast' == 'jest bardziej idiomatycznym sposobem robienia tego:' typ wydruku (d) to datetime.date'. – SpankMe

+0

Używanie type() do sprawdzania typów jest odradzane i nierozsądne, właściwym sposobem jest zrobienie isinstance. –

+1

W tym przypadku type() działa zgodnie z oczekiwaniami zarówno dla datetime.date, jak i datetime.datetime. isinstance (x, datetime.date) zwraca True, jeśli x jest datetime.date lub datetime.datetime. – Chuck

1

Jeśli istniejący kod jest już polegać na from datetime import datetime, można również po prostu importować date

from datetime import datetime, timedelta, date 
print isinstance(datetime.today().date(), date) 
2

W Pythonie 3.5, isinstance(x, date) robót dla mnie:

>>> from datetime import date 
>>> x = date(2012, 9, 1) 
>>> type(x) 
<class 'datetime.date'> 
>>> isinstance(x, date) 
True 
>>> type(x) is date 
True 
Powiązane problemy