什么是pythonic方法来检查构造函数参数的可行性?

Ale*_*tta 1 python error-handling types 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
Run Code Online (Sandbox Code Playgroud)

Jon*_*nts 6

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

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

请注意,basestring是家长strunicode在Python 2.x中,因此这将允许两个-要么使用str(因为你现在在2.X)不允许的unicode(反之亦然-什么特别的原因).在3.x中,basestring不存在,你刚刚得到str.


mgi*_*son 6

您想在__init__方法中引发错误:

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

*请注意,python2.x basestring也包括unicode,但在python3.x中不可用.

但是要小心,这里没有任何东西阻止用户person在构建完成后将人名重新设置为列表.

jack = Person("Jack")
jack.name = ["cheese","steak"]  #???
Run Code Online (Sandbox Code Playgroud)

如果你想要内置这种安全性,你需要开始学习property.