我在这里一般会遇到type checking的答案,numbers的类型检查,以及strings的类型检查。大多数人似乎回应说,由于鸭子打字,类型检查应该在python(< 2.6)中执行永远。我对鸭子打字的(有限)理解是通过使用对象的属性来确定类型。如果我没有使用任何属性,该怎么办?
我有一个简单的函数,它根据参数确定常量,该参数应该是一个数字。我引发了由
定义的异常class outOfBoundsError(ValueError):
"""
Specified value is outside the domain.
"""
告诉他们他们给我的号码太大了。我想保持这条消息的具体内容。但是如果参数是一个字符串(如'charlie'
),它仍然认为参数大于我指定的数字(并引发我的异常)。我应该在代码中添加一个虚拟行,如argument + 2
,以便引发TypeError吗?
注意:我对ABC一无所知,但我不认为它们可用,因为我们可以访问的最新python版本是2.5 :(。
答案 0 :(得分:5)
解决此问题的一种常见的鸭式解决方案是(尝试)将您所拥有的内容转换为您需要的内容。例如,如果您需要一个整数:
def getconstants(arg):
try:
arg = int(arg)
except:
raise TypeError("expected integer, or something that can be converted to one, but got " + repr(arg))
int
类型构造函数知道如何处理许多内置类型。此外,可转换为int
类型的类型可以实现__int__()
特殊方法,这将允许在此处使用它们。如果用户传入了一个字符串,只要它只包含数字就可以正常工作。
您执行某些只能在数字类型上执行的操作(例如添加2)的想法是类似的,并且在许多情况下会很好用,但是会因为可以转换为所需类型的字符串而失败,所以我更喜欢类型转换。
你可能会在没有try/except
的情况下离开,因为int()
如果无法进行转换会引发TypeError
或ValueError
,但我认为{ {1}}更合适,因为您主要对对象的类型感兴趣,因此我选择捕获异常并始终引发TypeError
。
答案 1 :(得分:2)
我诚实的回答
大多数人似乎回应说 绝不应该进行类型检查 由于在python(< 2.6)中执行 鸭子打字
是:废话。
需要进行类型检查 - 这是常见做法。
不要倾听所有事情,也不要接受所有未经过滤的陈述。
答案 2 :(得分:1)
您可以检查以确保您期望最初支持的类型。即。
def foo(arg):
if not isinstance(arg, int):
raise TypeError
...
如果你只支持整数,那没什么错。
答案 3 :(得分:0)
Introspection适用于此...原始类型也有类名:
>>> i=2
>>> i.__class__.__name__
'int'
>>> s="two"
>>> s.__class__.__name__
'str'
>>>