Python中如何简化多个同对象类型的OR条件判断写法?
问题描述
开发过程中编写if条件块时,需要在判断逻辑中加入多个类型比较规则,初始写法如下:
if type(widget1) is tk.Entry or type(widget1) is tk.OptionMenu or type(widget1) is tk.Label: # do something
上述写法重复书写了三次type(widget1),存在冗余。曾尝试过如下简化写法,但该写法无法正常运行,仅作思路示意:
if type(widget1) is tk.OptionMenu or tk.Entry or tk.Label: # do something
项目中多处代码都需要编写这类类型比较判断,希望找到更简洁的写法减少重复代码,提升编码效率,该问题并非tkinter专属场景。
解决方案
- 最直接的简化写法:使用
in关键字判断类型是否存在于目标类型元组中,逻辑和原写法完全等价,没有冗余:
if type(widget1) in (tk.Entry, tk.OptionMenu, tk.Label): # do something
后续需要新增判断类型时,直接在元组中追加类型即可。
- 更符合Python规范的类型判断写法:如果判断逻辑需要兼容对应类型的子类(比如自定义继承自tk.Entry的组件也需要命中判断),推荐使用
isinstance()做判断,该方法原生支持传入类型元组作为第二个参数,不需要写多个or连接判断条件:
if isinstance(widget1, (tk.Entry, tk.OptionMenu, tk.Label)): # do something
这种写法鲁棒性更强,是Python官方推荐的类型判断方式。
错误写法原因说明:之前尝试的写法中,
or会对连接的每个表达式独立判断真值,实际执行逻辑等价于(type(widget1) is tk.OptionMenu) or bool(tk.Entry) or bool(tk.Label)。由于类对象本身的布尔值恒为True,这个判断条件会永远成立,完全达不到类型过滤的效果。多场景复用优化:如果项目中多处用到同一组类型判断,可以把类型集合抽成全局常量复用,进一步降低重复代码,后续调整支持的类型时只需要修改一次常量定义即可:
# 提前统一定义支持的组件类型常量 SUPPORTED_WIDGET_TYPES = (tk.Entry, tk.OptionMenu, tk.Label) # 任意位置需要判断时直接复用 if isinstance(widget1, SUPPORTED_WIDGET_TYPES): # 对应逻辑 if isinstance(widget2, SUPPORTED_WIDGET_TYPES): # 其他位置的判断逻辑
内容的提问来源于stack exchange,提问作者KeyShoe
相关产品推荐
相关产品推荐

