1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-29 10:58:21 +00:00

utils: optimize __slots__ comparison

when comparing __slots__, do not create a new dict, but access attributes directly instead
This commit is contained in:
Vladyslav Burzakovskyy 2019-04-11 04:21:36 +02:00 committed by Jan Pochyla
parent 7533409765
commit 817c84e96e

View File

@ -104,10 +104,14 @@ def obj_eq(l, r):
""" """
if l.__class__ is not r.__class__: if l.__class__ is not r.__class__:
return False return False
if hasattr(l, "__slots__"): if not hasattr(l, "__slots__"):
return obj_slots_dict(l) == obj_slots_dict(r)
else:
return l.__dict__ == r.__dict__ return l.__dict__ == r.__dict__
if l.__slots__ is not r.__slots__:
return False
for slot in l.__slots__:
if getattr(l, slot, None) != getattr(r, slot, None):
return False
return True
def obj_repr(o): def obj_repr(o):
@ -115,17 +119,7 @@ def obj_repr(o):
Returns a string representation of object, supports __slots__. Returns a string representation of object, supports __slots__.
""" """
if hasattr(o, "__slots__"): if hasattr(o, "__slots__"):
d = obj_slots_dict(o) d = {attr: getattr(o, attr, None) for attr in o.__slots__}
else: else:
d = o.__dict__ d = o.__dict__
return "<%s: %s>" % (o.__class__.__name__, d) return "<%s: %s>" % (o.__class__.__name__, d)
def obj_slots_dict(o):
"""
Builds dict for o from defined __slots__.
"""
d = {}
for f in o.__slots__:
d[f] = getattr(o, f, None)
return d