python实现安全的int, float函数

类型转换总是会发生错误,尤其是当你的数据是由其他人通过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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案