python-3.x 使用类型检查替换类似的if语句,以确定参数的顺序

yr9zkbsy  于 2023-04-13  发布在  Python
关注(0)|答案(3)|浏览(111)

我的代码:

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)

有没有一种方法可以同时进行if比较?由于VectorLine对象是如何工作的,所以给point_to_line_distance的参数顺序很重要。我想检查 * ab中是否有一个是Line,然后检查另一个是否是Vector
做这件事的最好方法是什么?
我的方法是可行的,但我只想写干净的代码,我的解决方案并不理想。

1szpjjfi

1szpjjfi1#

如果你使用的是Python 3.10或更高版本,你可以使用structural pattern matching来替换if语句和显式类型检查:

def distance(a, b):
    match (a, b):
        case (Vector(), Line()):
            vector, line = a, b
        case (Line(), Vector()):
            line, vector = a, b
        case _:
            raise ValueError('Expected one Line and one Vector')
    return ObjectRelations.point_to_line_distance(vector, line)

标签:Convert multiple isinstance checks to structural pattern matching

hc2pp10m

hc2pp10m2#

首先,检查类型的正确方法是使用isinstance-这种方法还可以检查任何潜在的子类型。
其次,你可以通过找出哪个对象是Line来清理代码,将其分配给指定的变量,然后检查其他对象是否具有正确的类型,并在变量上明确其类型。

def distance(a, b):
    if isinstance(a, Line):
        line = a
        vec = b
    elif isinstance(b, Line):
        line = b
        vec = a
    if not isinstance(vec, Vector):
        raise TypeError
    return ObjectRelations.point_to_line_distance(vec, line)
fgw7neuy

fgw7neuy3#

您可以使用or连接两个if语句。
if (ta == Vector and tb == Line) or (ta == Line and tb == Vector):

相关问题