Python断言isinstance()向量

时间:2017-11-13 15:40:42

标签: python assert duck-typing isinstance

我正在尝试在python中实现Vector3类。如果我用c ++或c#编写Vector3类,我会将X,Y和Z成员存储为浮点数,但是在python中我读到了鸭子游戏的方法。所以根据我的c ++ / c#知识我写了这样的东西:

class Vector3:
    def __init__(self, x=0.0, y=0.0, z=0.0):
        assert (isinstance(x, float) or isinstance(x, int)) and (isinstance(y, float) or isinstance(y, int)) and \
               (isinstance(z, float) or isinstance(z, int))
        self.x = float(x)
        self.y = float(y)
        self.z = float(z)

关于断言语句的问题是:在此实例中是否使用它们(用于数学的Vector3实现)。我也用它来做像

这样的操作
def __add__(self, other):
    assert isinstance(other, Vector3)
    return Vector3(self.x + other.x, self.y + other.y, self.z + other.z)

你会在这些情况下使用assert吗? 根据这个网站:https://wiki.python.org/moin/UsingAssertionsEffectively它不应该被过度使用,但对于我来说,一直使用静态类型的人,不检查相同的数据类型是非常奇怪的。

1 个答案:

答案 0 :(得分:3)

assert更适合用于调试,而不是在生产代码中闲逛。当传递的值不是所需类型时,您可以为矢量属性xyz以及 raise ValueError 创建属性:

class Vector3:
    def __init__(self, x=0.0, y=0.0, z=0.0):
        self.x = x
        self.y = y
        self.z = z

    @property
    def x(self):
        return self._x

    @setter.x
    def x(self, val):
        if not isinstance(val, (int, float)):
            raise ValueError('Inappropriate type: {} for x whereas a float \
            or int is expected'.format(type(val)))
        self._x = float(val)

    ...

注意isinstance如何获取类型元组。

__add__运算符中,您需要raise TypeError,还包括相应的消息:

def __add__(self, other):
    if not isinstance(other, Vector3):
        raise TypeError('Object of type Vector3 expected, \
        however type {} was passed'.format(type(other)))
    ...