首页 > 解决方案 > 比多个 if 语句处理变量设置更简洁的解决方案

问题描述

我有一组 if 语句,它们根据我尝试执行的操作类型设置变量

if reverse_relationship and not get_all_links:
    traversal_function = 'reverse'
    annotation_function = 'forward'
elif reverse_relationship and get_all_links:
    traversal_function = 'all_reverse'
    annotation_function = 'all_forward'
    item_id_query = 'reverse'
elif get_all_links:
    traversal_function = 'all_forward'
    annotation_function = 'all_reverse'
    item_id_query = 'forward'
else:
    traversal_function = 'forward'
    annotation_function = 'reverse'

但我觉得必须有一种更简单的方法来做到这一点,因为上面的内容可能很难阅读。

标签: python

解决方案


您可以使用字典更简洁地执行此操作,其中键是包含 if 语句的布尔输入的元组,值是生成的三个字符串:

map = {
    (True, False): ('reverse', 'forward', None),
    (True, True): ('all_reverse', 'all_forward', 'reverse'),
    (False, True): ('all_forward', 'all_reverse', 'forward'),
    (False, False): ('forward', 'reverse', None),
}

traversal_function, annotation_function, item_id_query = map[(reverse_relationship, get_all_links)]

@konserw 的第二个答案是另一种方法,如果您想利用结果字符串是根据输入以逻辑方式构建的事实。请注意,他们提供的解决方案会导致item_query_id在所有情况下都具有非 None 值,这与您的代码不匹配。要获得与您的解决方案相同的结果,只需进行更改以查看get_all_links始终定义的内容,但None对于您未在代码中设置它的情况,您可以更改他们的答案:

item_id_query = None
traversal_function = 'reverse' if reverse_relationship else 'forward'
annotation_function = 'forward' if reverse_relationship else 'reverse'
if get_all_links:
    item_id_query = traversal_function
    traversal_function = f'all_{traversal_function}'
    annotation_function = f'all_{annotation_function}'

要使此代码与您的语句完全相同if,只需删除此代码的第一行。我不建议这样做,因为我认为您希望item_id_query在所有情况下都被定义。


推荐阅读