You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用类型检查合并相似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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:32:20