第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', [''])[0] or 0
green = my_values.get('green', [''])[0] or 0
opacity = my_values.get('opacity', [''])[0] or 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', [''])[0] or 0)
看起很难读。我们将它拆开成两部分。
red_str = my_values.get('red', [''])
red = int(red_str[0]) if red_str[0] else 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 使用辅助函数替代复杂表达式
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
相关推荐
暂无评论内容