python - 比多个 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'
但我觉得必须有一种更简单的方法来做到这一点,因为上面的内容可能很难阅读。
解决方案
您可以使用字典更简洁地执行此操作,其中键是包含 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
在所有情况下都被定义。
推荐阅读
- javascript - 使用 css 或 javascript 悬停几秒钟后显示一条消息
- java - 有没有办法从 json 或 yml 而不是类中引用 swagger @ApiResponse 中的响应?
- node.js - 客户端上的 HTTP 响应标头
- git - 从 git 开始:排除忽略的文件是不可能的
- laravel - 如何从路由中获取键值对参数
- sql - 基于列值获取数据的 SQL 查询
- gcc - 双精度浮点数如何存储在内存中?
- wpf - 将 ItemsControl 绑定到非 ObservableCollection 会导致内存泄漏吗?
- c++ - C++ 专用方法模板产生多个定义错误
- regex - 如何为例如 a/b/c 创建 htaccess seo 友好的 url rewriterules