Python: how can I check whether an object is of type datetime.date?

后端 未结 7 1089
既然无缘
既然无缘 2020-12-24 10:16

I have tried a few obvious options but none of them works:

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

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

In [15         


        
7条回答
  •  生来不讨喜
    2020-12-24 10:50

    If you are using freezegun package in tests you may need to have more smart isinstance checks which works well with FakeDate and original Date/Datetime beeing inside with freeze_time context:

    def isinstance_date(value):
        """Safe replacement for isinstance date which works smoothly also with Mocked freezetime"""
        import datetime
        if isinstance(value, datetime.date) and not isinstance(value, datetime.datetime):
            return True
        elif type(datetime.datetime.today().date()) == type(value):
            return True
        else:
            return False
    
    
    def isinstance_datetime(value):
        """Safe replacement for isinstance datetime which works smoothly also with Mocked freezetime """
        import datetime
        if isinstance(value, datetime.datetime):
            return True
        elif type(datetime.datetime.now()) == type(value):
            return True
        else:
            return False
    
    

    and tests to verify the implementation

    class TestDateUtils(TestCase):
    
        def setUp(self):
            self.date_orig = datetime.date(2000, 10, 10)
            self.datetime_orig = datetime.datetime(2000, 10, 10)
    
            with freeze_time('2001-01-01'):
                self.date_freezed = datetime.date(2002, 10, 10)
                self.datetime_freezed = datetime.datetime(2002, 10, 10)
    
        def test_isinstance_date(self):
            def check():
                self.assertTrue(isinstance_date(self.date_orig))
                self.assertTrue(isinstance_date(self.date_freezed))
                self.assertFalse(isinstance_date(self.datetime_orig))
                self.assertFalse(isinstance_date(self.datetime_freezed))
                self.assertFalse(isinstance_date(None))
    
            check()
            with freeze_time('2005-01-01'):
                check()
    
        def test_isinstance_datetime(self):
            def check():
                self.assertFalse(isinstance_datetime(self.date_orig))
                self.assertFalse(isinstance_datetime(self.date_freezed))
                self.assertTrue(isinstance_datetime(self.datetime_orig))
                self.assertTrue(isinstance_datetime(self.datetime_freezed))
                self.assertFalse(isinstance_datetime(None))
    
            check()
            with freeze_time('2005-01-01'):
                check()
    
    

提交回复
热议问题