Python90-5 使用辅助函数替代复杂表达式

第5条:使用辅助函数替代复杂表达式

Item 5: Write Helper Functions Instead of Complex Expressions

Python的简洁语法允许使用简单的一行表达式来实现复杂操作。例如,我想解码从URL获取的query string。

from urllib.parse import parse_qs
my_values = parse_qs('red=5&blue=0&green=',
                     keep_blank_values=True)
print(repr(my_values))
output:
{'red': ['5'], 'blue': ['0'], 'green': ['']}

有的query string 参数可能有多个值,有些有单个值,有的是空缺。使用get方法得到字典。

print('Red:     ', my_values.get('red'))
print('Green:   ', my_values.get('green'))
print('Opacity: ', my_values.get('opacity'))

如果当参数不存在或者空白时将默认值设置为0会非常有用。这可以用or来实现。当or前面为False时,返回后面值。

red = my_values.get('red', [''])[0or 0
green = my_values.get('green', [''])[0or 0
opacity = my_values.get('opacity', [''])[0or 0
print(f'Red:     {red!r}')
print(f'Green:   {green!r}')
print(f'Opacity: {opacity!r}')
output:
Red:     '5'
Green:   0
Opacity: 0

但是这还不够合适,我要把值转换成int以便进行数学计算。于是我用int将其包裹。

red = int(my_values.get('red', [''])[0or 0)

看起很难读。我们将它拆开成两部分。

red_str = my_values.get('red', [''])
red = int(red_str[0]) if red_str[0else 0

看起来清晰多了。将if-else展开的话:

green_str = my_values.get('green', [''])
if green_str[0]:
    green = int(green_str[0])
else:
    green = 0

如果你需要多次重复该操作,即使只有两三次,写一个helper函数很有帮助。

def get_first_int(values, key, default=0):
    found = values.get(key, [''])
    if found[0]:
        return int(found[0])
    return default

#调用变得清晰
green = get_first_int(my_values, 'green')

当表达式复杂起来时,就要考虑拆分到更小的部分并把逻辑移动到helper函数。不要因为Python的简洁语法使你陷入复杂表达式。 

遵循DRY原则:Don’t repeat yourself。

Things to Remember

  • • Pyhon的语法很容易写出单行复杂的表达式。但是阅读困难。

  • • 移动复杂表达式到helper函数中,尤其是你需要多次使用时。

  • • 和句内的or、and相比,if/else提供更好的可读性·


原文始发于微信公众号(一只大鸽子):Python90-5 使用辅助函数替代复杂表达式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/237463.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!