improve type coercion; coerce between equal-length uint subclasses

This commit is contained in:
protolambda 2019-06-20 21:08:34 +02:00
parent 8c6d2b42d8
commit 8bd204827b
No known key found for this signature in database
GPG Key ID: EC89FDBB2B4C7623
1 changed files with 12 additions and 7 deletions

View File

@ -94,7 +94,12 @@ def coerce_type_maybe(v, typ: SSZType, strict: bool = False):
# shortcut if it's already the type we are looking for
if v_typ == typ:
return v
elif isinstance(v, int) and not isinstance(v, uint): # do not coerce from one uintX to another uintY
elif isinstance(v, int):
if isinstance(v, uint): # do not coerce from one uintX to another uintY
if issubclass(typ, uint) and v.type().byte_len == typ.byte_len:
return typ(v)
# revert to default behavior below if-else. (ValueError/bare)
else:
return typ(v)
elif isinstance(v, (list, tuple)):
return typ(*v)
@ -102,7 +107,7 @@ def coerce_type_maybe(v, typ: SSZType, strict: bool = False):
return typ(v)
elif isinstance(v, GeneratorType):
return typ(v)
else:
# just return as-is, Value-checkers will take care of it not being coerced, if we are not strict.
if strict and not isinstance(v, typ):
raise ValueError("Type coercion of {} to {} failed".format(v, typ))