我知道,在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委托等价物?