在Python中验证构造函数参数的最佳实践方法是什么?在Python中验证构造函数参数
我是新来的语言,并且正在使用raise
:
class Breakfast(object):
def __init__(self, spam=None, eggs=0):
if not spam:
raise Error("Error: no spam")
这是愚蠢的,还是什么?
谢谢!
在Python中验证构造函数参数的最佳实践方法是什么?在Python中验证构造函数参数
我是新来的语言,并且正在使用raise
:
class Breakfast(object):
def __init__(self, spam=None, eggs=0):
if not spam:
raise Error("Error: no spam")
这是愚蠢的,还是什么?
谢谢!
如果您只是想确保传递所需的参数,那么请忽略默认值。如果参数丢失,Python会自动抛出一个TypeError。
def __init__(self, spam, eggs=0)
如果参数不是可选的,为什么你要为它提供默认参数?如果没有传递一个默认值的参数,Python解释器会自动产生一个错误。
在这种特殊情况下,不要让垃圾邮件关键字:
class Breakfast(object):
def __init__(self, spam, eggs=0):
"""Spam may not be none.
"""
# This is just validation of parameters which you can either
# do or leave. spam is part of the contract now and you documented
# that it may not be None
if not spam:
raise Error("Error: spam may not be None")
在您的具体的例子这将是最简单的不给spam
默认值 - 那么Python将诊断如果用户忘记传递该参数,那么问题在于你。 (但是,通过False
,0
,[]
,... as spam
对于Python来说可以,所以如果你有对他们的需求,你可能需要另外指定你自己的语义检查)。
如果您必须执行任何诊断,则在发生异常时引发异常是明智的。然而,它应该是适当的例外 - 例如,如果该值是可接受的类型但不能被接受为特定值,并且具有清晰,完整的消息,则为ValueError
。所以,总结:
class Breakfast(object):
def __init__(self, spam, eggs=0):
if not spam:
raise ValueError("falsish spam %r not acceptable" % (spam,))
(你需要包装spam
在单项元组(spam,)
这里,否则传递一个空的元组为spam
将导致复杂的,令人困惑的错误;-)。
谢谢 - 我没有意识到使用格式化字符串时需要考虑到这一点。 – mikewaters 2010-07-21 18:55:09
@threecheese,不客气 - 我完全明确地提到它,因为我知道人们往往不去想它;-)。 – 2010-07-21 20:46:11
首先,我想你的意思
if spam is None:
为Breakfast(0)
将布尔真为not spam
的将是[]
的说法,0.0
,''
,u''
等
其次,错误提出既是一个无信息的泛型类,而是一个更典型的ValueError
。最后,例外文本可以提供更多信息,并引导呼叫者进行修复。
而且,正如其他人所指出的那样,您通过设置一个不存在的默认值来牺牲自动检查。
如果它不是关键字,是否仍然可以将它作为关键字传递? (例如b = Breakfast(spam ='ham')) – mikewaters 2010-07-21 18:53:36
@threecheeseopera不,我不这么认为。 – extraneon 2010-07-22 09:28:11