当前位置: 首页 > 科技观察

使用技巧将字符串转换为特定类型

时间:2023-03-14 20:47:35 科技观察

我们有时可能需要将字符串转换为相应的类型。例如,将'123'转换为int类型123;或将'3.14'转换为浮点数3.14。前提是不能使用eval或exec。这是一个非常简单的函数。常规的方法是直接用if判断:defconvert(data,target_type):iftarget_type=='int':returnint(data)eliftarget_type=='float':returnfloat(data)...有同学觉得if判断写起来很麻烦,可能会用字典来处理:defconvert(data,target_type):type_map={'int':int,'float':float,...}returntype_map。get(target_type,str)(data)但是这样有个缺点,就是需要列出所有可以转换的格式。如果添加新的格式,还需要更改代码,添加elif分支或者添加键值对到字典中。那么有什么方法可以在不修改代码的情况下完成转换呢?一开始想不出什么好办法。直到今天看Scrapy的源码,发现有一段代码:这段代码中的type(custom)(convert(c)forcincustom)看起来很奇怪,但是只要解构一下就变成了很简单。我们今天要解决的问题就是这行代码的一部分。先来看写法的前半部分:type(custom)()。为什么type后面有两个括号?我们知道type(xxx)是返回xxx的数据类型:有人认为type(xxx)返回的是字符串。但实际上,它返回的是类型本身:既然我们可以使用int('123')将字符串转换为int,那么我们也可以使用type(1)('123')将字符串转换'123'转换为整数。那么,我们今天的问题解决方法就很简单了:defconvert(data,sample):returntype(sample)(data)调用函数时,传入两个参数,第一个是要转换的字符串,第二个参数,是任何目标类型的数据。运行效果如下图所示:本来,文章到这里就结束了。但是考虑到上面代码中的convert(c)forcincustom可能有同学不理解type(custom)(convert(c)forcincustom)看起来是列表推导式,但是方括号不见了,我再解释一下。例如,当你有一个只包含数字的列表时,你需要将每个数字乘以2,然后将其传递给函数,你通常这样写:defget_one_ele(data_list:List):print('具体执行代码')a=[1,2,3]get_one_ele([x*2forxina])但是如果函数只有这个参数,可以使用generator推导省略外括号,简写为:get_one_ele(x*2对于a)中的x。所以上面的代码type(custom)(convert(c)forcincustom)等价于:a=(convert(c)forcincustom)type(custom)(a)