当前位置: 首页 > 面试题库 >

检查函数参数类型是否为Pythonic?

陈实
2023-03-14
问题内容

我知道,在Python中通常不赞成使用类型检查函数参数,但我认为这样做很有意义。

在我的项目中,我有一个抽象基类Coord和一个子类Vector,该子类具有更多功能,例如旋转,幅度变化等。数字的列表和元组也将返回True,因为isinstance(x, Coord).我也有许多接受这些Coord类型作为参数的函数和方法。 。我已经设置了装饰器来检查这些方法的参数。这是一个简化的版本:

class accepts(object):
    def __init__(self, *types):
        self.types = types

    def __call__(self, func):
        def wrapper(*args):
            for i in len(args):
                if not isinstance(args[i], self.types[i]):
                    raise TypeError

            return func(*args)

        return wrapper

这个版本非常简单,仍然有一些错误。只是为了说明这一点。它的用法如下:

@accepts(numbers.Number, numbers.Number)
def add(x, y):
    return x + y

注意:我仅根据抽象基类检查参数类型。

这是一个好主意吗?有没有更好的方法,而不必在每个方法中都重复类似的代码?

编辑:

如果我要做同样的事情,但是我没有在装饰器中预先检查类型,而是在装饰器中捕获异常:

class accepts(object):
    def __init__(self, *types):
        self.types = types

    def __call__(self, func):
        def wrapper(*args):

            try:
                return func(*args)
            except TypeError:
                raise TypeError, message
            except AttributeError:
                raise AttributeError, message

        return wrapper

那好吗?


问题答案:

您的口味可能会有所不同,但是Pythonic(tm)风格只是继续使用并根据需要使用对象。如果他们不支持您尝试的操作,则会引发异常。这就是所谓的鸭子打字。

支持这种样式的原因有很多:首先,只要新对象支持正确的操作,它就允许您在现有代码中使用新型对象,从而实现多态。其次,它通过避免大量检查来简化成功的道路。

当然,使用类型参数检查时得到的错误消息比使用鸭子输入类型更清晰,但是正如我所说,您的口味可能会有所不同。



 类似资料:
  • 问题内容: 假设我有任何变量,定义如下: 我想要一个检查变量类型是否像函数一样的函数。即: 如何检查变量是否为上述定义的类型? 问题答案: 当然,下划线的方式效率更高,但是当效率不是问题时,最好的检查方法是写在@Paul Rosania链接的下划线页面上。 受下划线启发,最终的isFunction函数如下:

  • 本文向大家介绍如何检查JavaScript变量是否为函数类型?,包括了如何检查JavaScript变量是否为函数类型?的使用技巧和注意事项,需要的朋友参考一下 使用“ typeof”检查它是否是一个函数。您可以尝试运行以下代码来检查JavaScript变量是否为函数类型: 示例

  • 问题内容: 我需要检查值是否为整数。我发现了这一点:如何检查输入值是整数还是浮点数?,但如果我没记错的话,即使 值 本身确实是,变量仍然是类型。 问题答案: 如果输入值可以是整数以外的其他数字形式,请按 如果传递字符串值, 请使用,请确保在转换失败的情况下使用try catch进行错误处理。

  • 问题 你希望检查一个变量是否为一个数组。 myArray = [] console.log typeof myArray // outputs 'object' “typeof” 运算符为数组输出了一个错误的结果。 解决方案 使用下面的代码: typeIsArray = Array.isArray || ( value ) -> return {}.toString.call( value ) i

  • 我想使返回数据类型的的函数与传入的参数的数据类型相同。例如,我会这样调用函数: 因为我将一个传递给,所以它返回了一个

  • 在TypeScript中,我可以将函数的一个参数声明为类型函数。是否有一种“类型安全”的方式来完成这件事,而这是我所缺少的?例如,考虑以下内容: save回调不是类型安全的,我给它一个回调函数,其中函数的参数是一个字符串,但我传递给它一个数字,并且编译时没有错误。我可以在保存类型安全函数中设置结果参数吗? TL;DR版本:在TypeScript中是否存在与.NET委托等价物?