类型转换总是会发生错误,尤其是当你的数据是由其他人通过API接口提供时,虽然文档上约定这个字段是int类型,但实际传给你时可能已经变成一个空的字符串。这种不按文档严格传输数据的情况时有发生,如果你对其他人传入的数据不信任而要亲自做类型转换的话,那么就得考虑编写一个安全的int函数和float函数。
为什么要编写专门的转换函数呢?简单说,我不希望在代码里看到一大堆的try ... except语句,毕竟这种类型转换几乎无处不在,所以,我需要一个专门的函数,为此我设计了如下两个函数
import logging
logger = logging.getLogger('my_log')
logger.setLevel(logging.INFO)
def safe_int(value, default_return=0, is_log=False):
'''
提供安全的类型转换函数,将value转换为int类型
:param value:需要被转换的数据
:param default_return: 转换失败时的返回值
:param is_log:是否记录日志
:return:
'''
pass
def safe_float(value, default_return=0, is_log=False):
'''
提供安全的类型转换函数,将value转换为float类型
:param value:需要被转换的数据
:param default_return: 转换失败时的返回值
:param is_log:是否记录日志
:return:
'''
我的目标是设计实现两个安全的类型转换函数,我可以定义转换失败时的返回值,如果我想把失败原因记录下来,只需要将is_log设置为True。这两个函数看起来功能几乎相同,因此还需要一个公共的函数来完成这些操作
def super_transfer(_type, value, default_return=0, is_log=False):
try:
result = _type(value)
except:
result = default_return
if is_log:
logger.error('将{value}转换为{_type}类型时失败'.format(value=value, _type=_type))
return result
def safe_int(value, default_return=0, is_log=False):
'''
提供安全的类型转换函数,将value转换为int类型
:param value:需要被转换的数据
:param default_return: 转换失败时的返回值
:param is_log:是否记录日志
:return:
'''
return super_transfer(int, value, default_return, is_log)
def safe_float(value, default_return=0, is_log=False):
'''
提供安全的类型转换函数,将value转换为float类型
:param value:需要被转换的数据
:param default_return: 转换失败时的返回值
:param is_log:是否记录日志
:return:
'''
return super_transfer(float, value, default_return, is_log)
现在,来测试一下效果吧
def test():
print(safe_float(2))
print(safe_float('3'))
print(safe_float('3f', is_log=True))
print(safe_int(98.8))
print(safe_int('8i', is_log=True))
if __name__ == '__main__':
test()
程序输出结果
2.0
3.0
0
98
0
将3f转换为<class 'float'>类型时失败
将8i转换为<class 'int'>类型时失败
转换失败时,函数返回了默认值,同时在日志中记录了失败的原因,当然我写的这个日志对象很简单,你在实践中应当使用功能更加完善的log对象
QQ交流群: 211426309