gpt4 book ai didi

python - 检查函数参数类型是 Pythonic 吗?

转载 作者:IT老高 更新时间:2023-10-28 20:50:58 24 4
gpt4 key购买 nike

我知道,类型检查函数参数在 Python 中通常是不受欢迎的,但我认为我已经想出了一个有意义的情况。

在我的项目中,我有一个抽象基类 Coord,它有一个子类 Vector,它具有更多功能,如旋转、改变大小等。数字的列表和元组isinstance(x, Coord) 也将返回 True。 我还有许多接受这些 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

这个版本很简单,还是有一些bug。它只是为了说明这一点。它会像这样使用:

@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) 风格是继续前进并根据需要使用对象。如果它们不支持您尝试的操作,则会引发异常。这被称为 duck typing .

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

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

关于python - 检查函数参数类型是 Pythonic 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1950386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com