effective python-用辅助函数取代复杂的表达式

本文介绍如何使用辅助函数处理urllib.parse.parse_qs函数的查询参数,关注0值、空值的转换,以及使用f-string和get方法优化代码可读性。通过实例展示了如何创建get_first_int函数解决url参数处理的重复问题。
摘要由CSDN通过智能技术生成

用辅助函数取代复杂的表达式

urllib.parse的parse_qs函数,可以把url中暴露出来的查询参数拆分成键值对的形式,并把他们放进dict内
使用场景:爬虫处理url参数或者接口测试时处理url参数

from urllib.parse import parse_qs

url = "https://www.baidu.com/s?wd=1&rsv_spt=0&rsv_id="
args = url.split("?")[1]
my_values = parse_qs(args, keep_blank_values=True)
print(my_values)

结果

{'wd': ['1'], 'rsv_spt': ['0'], 'rsv_id': ['']}

    {'wd': ['aa'], 'rsv_spt': ['0'], 'rsv_id': ['']}
    从结果来看,我们看到有三种情况
        1.有值
        2.0
        3.空值
    那么针对0和空值,我们可以做一个特殊处理

下面会讲解有关f-str的用法
详情请参考上一篇文章: effective python-高级字符串格式化

"""
	直接用Boolean表达式实现,若左边值为false,就取右边的0
"""

# 补充一下get语法,get()在这里如果没有对应的键,返回一个空值
wd = my_values.get('wd', [''])[0] or 0
rsv_spt = my_values.get('rsv_spt', [''])[0] or 0
rsv_id = my_values.get('rsv_id', [''])[0] or 0

# f-str的 {val!r} 用法 相当于 {repr(val)}
# repr() 方法可以将读取到的格式字符,比如换行符、制表符,转化为其相应的转义字符。
print(f"wd:  {wd!r} ")
print(f"rsv_spt:  {rsv_spt!r} ")
print(f"rsv_id:  {rsv_id!r} ")

结果

wd:  '1' 
rsv_spt:  '0' 
rsv_id:  0 

但发现个问题rsv_spt是字符串的0对于这些还要做一个int转换处理

rsv_spt = int(my_values.get('rsv_spt', [''])[0] or 0)
print("转换后rsv_spt:", rsv_spt)

结果

转换后rsv_spt: 0

看着就很乱,这时候就达不到我们想要的效果,而且可读性很差

# 可以使用if,else的三元表达式
rsv_spt_str = my_values.get('rsv_spt', [''])
rsv_spt = int(rsv_spt_str[0]) if rsv_spt_str[0] else 0
print("转换后rsv_spt:", rsv_spt)

结果

转换后rsv_spt: 0

越看越乱,对于不同的url传过来,还要重写一遍,非常麻烦

# 可以通过使用辅助函数解决问题
def get_first_int(values, key, default):
    found = values.get(key, [''])
    if found[0]:
        return int(found[0])
    else:
        return default
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值