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)
这是关于它 - 没有使用某种形式的装饰器,但通常,类型检查不是很Pythonic,虽然在某些情况下有效,你的代码应该是:
def __init__(self, name):
if not isinstance(name, basestring):
raise TypeError('name must be str/unicode')
# ...
Run Code Online (Sandbox Code Playgroud)
请注意,basestring是家长str和unicode在Python 2.x中,因此这将允许两个-要么使用str(因为你现在在2.X)不允许的unicode(反之亦然-什么特别的原因).在3.x中,basestring不存在,你刚刚得到str.
您想在__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.
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |