我正在尝试使用ABC和... 检查单个参数的类型相当简单:
def spam_method(param):
if not isinstance(param, SpamInterface):
raise TypeError
看起来不错。在方法定义的第一行中提到了我需要什么类型。但是传递列表呢?我是这样做的:
def many_spams(list_param):
if list_param and not isinstance(list_param[0], SpamInterface):
raise TypeError
但是我对此并不完全满意。还有更优雅的方式吗?你会怎么做?
答案 0 :(得分:0)
我假设您要检查list_param
中的每个对象都是SpamInterface
类型。在这种情况下,有两种不同的检查方法。首先,我们使用all()
函数的懒惰方式:
def many_spams(list_param):
if not all(isinstance(p, SpamInterface) for p in list_param):
raise TypeError('Not all objects are of type SpamInterface')
此方法很简短,但它不会告诉您列表中的哪个元素未通过测试。第二种方法提供了更多细节:
def many_spams(list_param):
for index, param in enumerate(list_param):
if not isinstance(param, SpamInterface):
raise TypeError('Parameter at index {} is not of type SpamInterface: {}'.format(index, param))
此方法将在第一个非SpamInterface
类型的元素上引发异常。