Merge pull request #883 from croneter/fix-valueerror

Fix ValueError if casting to int/float
This commit is contained in:
croneter 2019-06-12 20:05:37 +02:00 committed by GitHub
commit cd524cb978
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 26 deletions

View file

@ -20,32 +20,47 @@ WINDOW_COMMAND = 'plexkodiconnect.command'.encode('utf-8')
def cast(func, value): def cast(func, value):
""" """
Cast the specified value to the specified type (returned by func). Currently this Cast the specified value to the specified type (returned by func). Currently
only support int, float, bool. Should be extended if needed. this only support int, float, bool. Should be extended if needed.
Parameters: Parameters:
func (func): Calback function to used cast to type (int, bool, float). func (func): Calback function to used cast to type (int, bool, float).
value (any): value to be cast and returned. value (any): value to be cast and returned.
Returns None if something goes wrong
""" """
if value is not None: if value is None:
if func == bool: return value
elif func == bool:
return bool(int(value)) return bool(int(value))
elif func == unicode: elif func == unicode:
if isinstance(value, (int, long, float)): if isinstance(value, (int, long, float)):
return unicode(value) return unicode(value)
elif isinstance(value, unicode):
return value
else: else:
return value.decode('utf-8') return value.decode('utf-8')
elif func == str: elif func == str:
if isinstance(value, (int, long, float)): if isinstance(value, (int, long, float)):
return str(value) return str(value)
elif isinstance(value, str):
return value
else: else:
return value.encode('utf-8') return value.encode('utf-8')
elif func in (int, float): elif func == int:
try: try:
return func(value) return int(value)
except ValueError: except ValueError:
return float('nan') try:
# Converting e.g. '8.0' fails; need to convert to float first
return int(float(value))
except ValueError:
return
elif func == float:
try:
return float(value)
except ValueError:
return
return func(value) return func(value)
return value
def kodi_window(property, value=None, clear=False): def kodi_window(property, value=None, clear=False):

View file

@ -268,11 +268,13 @@ class AttributeDict(dict):
def cast(func, value): def cast(func, value):
""" """
Cast the specified value to the specified type (returned by func). Currently this Cast the specified value to the specified type (returned by func). Currently
only support int, float, bool. Should be extended if needed. this only support int, float, bool. Should be extended if needed.
Parameters: Parameters:
func (func): Calback function to used cast to type (int, bool, float). func (func): Calback function to used cast to type (int, bool, float).
value (any): value to be cast and returned. value (any): value to be cast and returned.
Returns None if something goes wrong
""" """
if value is None: if value is None:
return value return value
@ -294,18 +296,18 @@ def cast(func, value):
return value.encode('utf-8') return value.encode('utf-8')
elif func == int: elif func == int:
try: try:
return func(value) return int(value)
except ValueError: except ValueError:
try: try:
# Converting e.g. '8.0' fails; need to convert to float first # Converting e.g. '8.0' fails; need to convert to float first
return int(float(value)) return int(float(value))
except ValueError: except ValueError:
return float('nan') return
elif func == float: elif func == float:
try: try:
return func(value) return float(value)
except ValueError: except ValueError:
return float('nan') return
return func(value) return func(value)