如果没有使用其属性,我如何避免类型检查python对象?

时间:2011-04-11 19:59:25

标签: python

我在这里一般会遇到type checking的答案,numbers的类型检查,以及strings的类型检查。大多数人似乎回应说,由于鸭子打字,类型检查应该在python(< 2.6)中执行永远。我对鸭子打字的(有限)理解是通过使用对象的属性来确定类型。如果我没有使用任何属性,该怎么办?

我有一个简单的函数,它根据参数确定常量,该参数应该是一个数字。我引发了由

定义的异常
class outOfBoundsError(ValueError):
    """
    Specified value is outside the domain.
    """

告诉他们他们给我的号码太大了。我想保持这条消息的具体内容。但是如果参数是一个字符串(如'charlie'),它仍然认为参数大于我指定的数字(并引发我的异常)。我应该在代码中添加一个虚拟行,如argument + 2,以便引发TypeError吗?

注意:我对ABC一无所知,但我不认为它们可用,因为我们可以访问的最新python版本是2.5 :(。

4 个答案:

答案 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()如果无法进行转换会引发TypeErrorValueError,但我认为{ {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'
>>>
相关问题