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

How can I avoid type checking a python object if its attributes aren't used?

我在这里遇到了一般类型检查、数字类型检查和字符串类型检查的答案。大多数人似乎回答说,由于duck类型,不应该在python(<2.6)中执行类型检查。我对duck类型的(有限)理解是,类型是由使用对象的属性决定的。如果不使用任何属性,我该怎么做?

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

1
2
3
4
class outOfBoundsError(ValueError):
   """
    Specified value is outside the domain.
   """

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

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


对于这个问题,一个常见的鸭子式的Python解决方案是(尝试)将您得到的转换为您需要的。例如,如果需要整数:

1
2
3
4
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,但我认为TypeError更合适,因为你主要对对象的类型感兴趣,所以我选择了抓住例外,总是提高TypeError


我诚实的回答

Most people seem to respond by saying
that type checking should never be
performed in python (< 2.6) due to duck typing

是胡说八道。

类型检查是常见的做法。

不要全神贯注,不要接受未经过滤的每一句话。


您可以检查以确保您期望最初支持的类型。即

1
2
3
4
def foo(arg):
    if not isinstance(arg, int):
        raise TypeError
    ...

如果你只支持整数,那就没什么错。


内省对这个有用…基元类型也有类名:

1
2
3
4
5
6
7
>>> i=2
>>> i.__class__.__name__
'int'
>>> s="two"
>>> s.__class__.__name__
'str'
>>>