检查构造函数参数有效性的pythonic方法是什么?

时间:2012-12-18 16:21:27

标签: python types error-handling type-safety

例如,参加一个代表一个人的简单类。唯一的class属性是表示人名的字符串。我想确保没有人试图传递构造函数一些其他类型的对象,如int或list ...等。这是我下面的第一次尝试,我认为如果参数不是str,它会返回一个类型为None的obj,但它似乎仍然返回一个Person obj。我来自一个“更”强烈的类型语言背景,我有点困惑如何在python中处理我的自我。 pythonic风格对这种情况和类型安全性更普遍的说法是什么?我应该提出例外吗?或者找到一种方法来返回None?或完全不同的东西。

class Person: 

    name = None

    def __init__(self, name):
        if not isinstance(name, str):
            return None
        self.name = name

3 个答案:

答案 0 :(得分:6)

这就是它 - 没有使用某种形式的装饰器,但通常,类型检查不是很Pythonic,虽然在某些情况下有效,但你的代码应该是:

def __init__(self, name):
    if not isinstance(name, basestring):
        raise TypeError('name must be str/unicode')
    # ...

请注意,basestring是Python 2.x中strunicode的父级,因此这将允许两者 - 使用str(就像您现在所使用的那样) 2.x)不允许unicode(反之亦然 - 出于任何特殊原因)。在3.x中,basestring不存在,您刚刚获得str

答案 1 :(得分:6)

您希望在__init__方法中引发错误:

if not isinstance(name,basestring):
    raise TypeError("I don't think that is a name ...")

*请注意,basestring还包含python2.x的unicode,但在python3.x中不可用。

但是,请注意,在person构建完成后,此处没有任何内容可以阻止用户将人名重新设置为列表。

jack = Person("Jack")
jack.name = ["cheese","steak"]  #???

如果您想要内置此安全功能,则需要开始了解property

答案 2 :(得分:0)

我不会在这里返回None,而是提升和异常来表示不正确的对象类型。