1

I am working on make python 2.7 code compatible for python 3.6.

Code is working fine in python 2.7 but i am getting datetime issue in python 3.6 :

 def insert_event(self, subject_event):
        for x in range (0,self.event_count):
            if self.events[x].time <= subject_event.time:


TypeError: '<=' not supported between instances of 'type' and 'datetime.datetime'

When i did debug the code i got this:

In python 3.6 :

(Pdb) print (subject_event)
<event.Event object at 0x7f89b7cdb908>
(Pdb) print (subject_event.time)
2018-01-01 06:05:00
(Pdb) self.events
[<event.Event object at 0x7f89b7cd1da0>, <event.Event object at 0x7f89b7cd1828>]
(Pdb) self.events[0]
<event.Event object at 0x7f89b7cd1da0>
(Pdb) self.events[0].time
<class 'datetime.datetime'>



(Pdb) self.events[x]
<event.Event object at 0x7ffb339a31d0>
(Pdb) type(self.events[x])
<class 'event.Event'>
(Pdb) self.events[x].time
<class 'datetime.datetime'>
(Pdb) type(self.events[x].time)
<class 'type'>

(Pdb) self.events[x].__dict__
{'time': <class 'datetime.datetime'>, 'id': 'bcdfd404-67e9-4ef3-a699-8afde902685e', 'constraint': None, 'constraint_time': <class 'datetime.time'>, 'action': 'ShiftStart', 'cust_in_car': 0, 'previous': None, 'neo_id': 1340, 'user': None, 'place': None, 'resource': None, 'shift': None, 'linked': None, 'epoch': 1514775600000, '_driver': <neo4j.v1.direct.DirectDriver object at 0x7ffb339a3390>}
(Pdb) self.events[x].time.__dict__
mappingproxy({'__repr__': <slot wrapper '__repr__' of 'datetime.datetime' objects>, '__hash__': <slot wrapper '__hash__' of 'datetime.datetime' objects>, '__str__': <slot wrapper '__str__' of 'datetime.datetime' objects>, '__getattribute__': <slot wrapper '__getattribute__' of 'datetime.datetime' objects>, '__lt__': <slot wrapper '__lt__' of 'datetime.datetime' objects>, '__le__': <slot wrapper '__le__' of 'datetime.datetime' objects>, '__eq__': <slot wrapper '__eq__' of 'datetime.datetime' objects>, '__ne__': <slot wrapper '__ne__' of 'datetime.datetime' objects>, '__gt__': <slot wrapper '__gt__' of 'datetime.datetime' objects>, '__ge__': <slot wrapper '__ge__' of 'datetime.datetime' objects>, '__add__': <slot wrapper '__add__' of 'datetime.datetime' objects>, '__radd__': <slot wrapper '__radd__' of 'datetime.datetime' objects>, '__sub__': <slot wrapper '__sub__' of 'datetime.datetime' objects>, '__rsub__': <slot wrapper '__rsub__' of 'datetime.datetime' objects>, '__new__': <built-in method __new__ of type object at 0x9f7500>, 'now': <method 'now' of 'datetime.datetime' objects>, 'utcnow': <method 'utcnow' of 'datetime.datetime' objects>, 'fromtimestamp': <method 'fromtimestamp' of 'datetime.datetime' objects>, 'utcfromtimestamp': <method 'utcfromtimestamp' of 'datetime.datetime' objects>, 'strptime': <method 'strptime' of 'datetime.datetime' objects>, 'combine': <method 'combine' of 'datetime.datetime' objects>, 'date': <method 'date' of 'datetime.datetime' objects>, 'time': <method 'time' of 'datetime.datetime' objects>, 'timetz': <method 'timetz' of 'datetime.datetime' objects>, 'ctime': <method 'ctime' of 'datetime.datetime' objects>, 'timetuple': <method 'timetuple' of 'datetime.datetime' objects>, 'timestamp': <method 'timestamp' of 'datetime.datetime' objects>, 'utctimetuple': <method 'utctimetuple' of 'datetime.datetime' objects>, 'isoformat': <method 'isoformat' of 'datetime.datetime' objects>, 'utcoffset': <method 'utcoffset' of 'datetime.datetime' objects>, 'tzname': <method 'tzname' of 'datetime.datetime' objects>, 'dst': <method 'dst' of 'datetime.datetime' objects>, 'replace': <method 'replace' of 'datetime.datetime' objects>, 'astimezone': <method 'astimezone' of 'datetime.datetime' objects>, '__reduce_ex__': <method '__reduce_ex__' of 'datetime.datetime' objects>, '__reduce__': <method '__reduce__' of 'datetime.datetime' objects>, 'hour': <attribute 'hour' of 'datetime.datetime' objects>, 'minute': <attribute 'minute' of 'datetime.datetime' objects>, 'second': <attribute 'second' of 'datetime.datetime' objects>, 'microsecond': <attribute 'microsecond' of 'datetime.datetime' objects>, 'tzinfo': <attribute 'tzinfo' of 'datetime.datetime' objects>, 'fold': <attribute 'fold' of 'datetime.datetime' objects>, '__doc__': 'datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\nThe year, month and day arguments are required. tzinfo may be None, or an\ninstance of a tzinfo subclass. The remaining arguments may be ints.\n', 'min': datetime.datetime(1, 1, 1, 0, 0), 'max': datetime.datetime(9999, 12, 31, 23, 59, 59, 999999), 'resolution': datetime.timedelta(0, 0, 1)})

In python 2.7 :

(Pdb) self.events[x]
<event.Event object at 0x7fce0b43c590>
(Pdb) type(self.events[x])
<class 'event.Event'>
(Pdb) self.events[x].time
<type 'datetime.datetime'>
(Pdb) type(self.events[x].time)
<type 'type'>

(Pdb) self.events[x].__dict__
{'resource': None, 'constraint_time': <type 'datetime.time'>, 'constraint': None, 'shift': None, '_driver': <neo4j.v1.direct.DirectDriver object at 0x7fce0b43c910>, 'cust_in_car': 0, 'linked': None, 'epoch': 1514775600000, 'place': None, 'user': None, 'time': <type 'datetime.datetime'>, 'action': 'ShiftStart', 'neo_id': 2339, 'id': 'e828acca-5d32-42e1-967d-c044c775ae47', 'previous': None}
(Pdb) self.events[x].time.__dict__
dict_proxy({'__str__': <slot wrapper '__str__' of 'datetime.datetime' objects>, '__getattribute__': <slot wrapper '__getattribute__' of 'datetime.datetime' objects>, '__radd__': <slot wrapper '__radd__' of 'datetime.datetime' objects>, 'utctimetuple': <method 'utctimetuple' of 'datetime.datetime' objects>, 'second': <attribute 'second' of 'datetime.datetime' objects>, 'utcnow': <method 'utcnow' of 'datetime.datetime' objects>, '__lt__': <slot wrapper '__lt__' of 'datetime.datetime' objects>, '__sub__': <slot wrapper '__sub__' of 'datetime.datetime' objects>, '__new__': <built-in method __new__ of type object at 0x939c20>, 'min': datetime.datetime(1, 1, 1, 0, 0), 'dst': <method 'dst' of 'datetime.datetime' objects>, 'astimezone': <method 'astimezone' of 'datetime.datetime' objects>, 'strptime': <method 'strptime' of 'datetime.datetime' objects>, 'utcfromtimestamp': <method 'utcfromtimestamp' of 'datetime.datetime' objects>, 'combine': <method 'combine' of 'datetime.datetime' objects>, 'timetuple': <method 'timetuple' of 'datetime.datetime' objects>, 'max': datetime.datetime(9999, 12, 31, 23, 59, 59, 999999), 'tzinfo': <attribute 'tzinfo' of 'datetime.datetime' objects>, '__doc__': 'datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\nThe year, month and day arguments are required. tzinfo may be None, or an\ninstance of a tzinfo subclass. The remaining arguments may be ints or longs.\n', 'tzname': <method 'tzname' of 'datetime.datetime' objects>, 'isoformat': <method 'isoformat' of 'datetime.datetime' objects>, '__ne__': <slot wrapper '__ne__' of 'datetime.datetime' objects>, '__reduce__': <method '__reduce__' of 'datetime.datetime' objects>, 'replace': <method 'replace' of 'datetime.datetime' objects>, 'utcoffset': <method 'utcoffset' of 'datetime.datetime' objects>, 'microsecond': <attribute 'microsecond' of 'datetime.datetime' objects>, '__add__': <slot wrapper '__add__' of 'datetime.datetime' objects>, '__gt__': <slot wrapper '__gt__' of 'datetime.datetime' objects>, 'date': <method 'date' of 'datetime.datetime' objects>, 'now': <method 'now' of 'datetime.datetime' objects>, '__eq__': <slot wrapper '__eq__' of 'datetime.datetime' objects>, 'minute': <attribute 'minute' of 'datetime.datetime' objects>, 'ctime': <method 'ctime' of 'datetime.datetime' objects>, 'hour': <attribute 'hour' of 'datetime.datetime' objects>, 'fromtimestamp': <method 'fromtimestamp' of 'datetime.datetime' objects>, '__le__': <slot wrapper '__le__' of 'datetime.datetime' objects>, '__repr__': <slot wrapper '__repr__' of 'datetime.datetime' objects>, 'time': <method 'time' of 'datetime.datetime' objects>, '__hash__': <slot wrapper '__hash__' of 'datetime.datetime' objects>, '__rsub__': <slot wrapper '__rsub__' of 'datetime.datetime' objects>, 'timetz': <method 'timetz' of 'datetime.datetime' objects>, 'resolution': datetime.timedelta(0, 0, 1), '__ge__': <slot wrapper '__ge__' of 'datetime.datetime' objects>})

Any changes in datetime in python 3.6 ?

2
  • Your first value in comparison is not a DateTime instance but the DateTime class. Commented Nov 22, 2017 at 12:17
  • try this in python2.7 and python3: import datetime; type(datetime.datetime.now()) <= datetime.datetime.now() you will get False in python2.7 and unorderable type error in python3. my guess is the code was never working in the first place. Commented Nov 22, 2017 at 12:20

1 Answer 1

2

The reason for the TypeError is that in Python 3 objects of different types are not comparable (with some exceptions, such as numeric types). In Python 2 comparing objects of different types is legal.

Check What's new in Python 3 for more details.

BTW, you most likely want to compare two datetime instances, not the class and an instance.

Sign up to request clarification or add additional context in comments.

2 Comments

in python 2.7 :from datetime import datetime ; start_date = datetime , type of start_date is type. in python 3.6 : from datetime import datetime; start_date = datetime , type of start_date is class.
start_date <= datetime.now(), will get true/false in python 2.7 and in python 3.6 , start_time <= datetime.now() , will get typeerror

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.