如何用类型检查合并相似if语句,优化distance函数参数顺序?
优化类型判断的简洁实现
问题描述
我编写了如下Python代码:
def distance(a, b): ta = type(a) tb = type(b) if (ta == Vector and tb == Line): return ObjectRelations.point_to_line_distance(a, b) if (ta == Line and tb == Vector): return ObjectRelations.point_to_line_distance(b, a)由于
point_to_line_distance的参数顺序会影响结果,我希望将两个if判断合并为一个逻辑,检查a、b分别为Vector和Line的两种情况,寻求更简洁优雅的实现方式。
解决方案
方法1:利用集合判断类型组合
借助集合的无序性,直接判断两个参数的类型是否恰好是Vector和Line的组合,再区分点和线:
def distance(a, b): if {type(a), type(b)} == {Vector, Line}: point, line = (a, b) if isinstance(a, Vector) else (b, a) return ObjectRelations.point_to_line_distance(point, line)
方法2:枚举合法的类型元组
直接列出所有合法的类型对,一次判断完成匹配,逻辑直观易懂:
def distance(a, b): ta, tb = type(a), type(b) if (ta, tb) in {(Vector, Line), (Line, Vector)}: point = a if ta == Vector else b line = b if ta == Vector else a return ObjectRelations.point_to_line_distance(point, line)
方法3:使用isinstance增强健壮性
如果需要支持子类场景,用isinstance替代直接比较type()会更灵活(兼容子类实例):
def distance(a, b): a_is_vector = isinstance(a, Vector) b_is_line = isinstance(b, Line) a_is_line = isinstance(a, Line) b_is_vector = isinstance(b, Vector) if (a_is_vector and b_is_line) or (a_is_line and b_is_vector): point = a if a_is_vector else b line = b if a_is_vector else a return ObjectRelations.point_to_line_distance(point, line)
内容的提问来源于stack exchange,提问作者joppo
相关产品推荐
相关产品推荐

