2010-07-21 84 views
0

在Python中验证构造函数参数的最佳实践方法是什么?在Python中验证构造函数参数

我是新来的语言,并且正在使用raise

class Breakfast(object): 
    def __init__(self, spam=None, eggs=0): 
     if not spam: 
      raise Error("Error: no spam") 

这是愚蠢的,还是什么?

谢谢!

回答

4

如果您只是想确保传递所需的参数,那么请忽略默认值。如果参数丢失,Python会自动抛出一个TypeError。

def __init__(self, spam, eggs=0) 
3

如果参数不是可选的,为什么你要为它提供默认参数?如果没有传递一个默认值的参数,Python解释器会自动产生一个错误。

0

在这种特殊情况下,不要让垃圾邮件关键字:

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") 
+0

如果它不是关键字,是否仍然可以将它作为关键字传递? (例如b = Breakfast(spam ='ham')) – mikewaters 2010-07-21 18:53:36

+0

@threecheeseopera不,我不这么认为。 – extraneon 2010-07-22 09:28:11

3

在您的具体的例子这将是最简单的spam默认值 - 那么Python将诊断如果用户忘记传递该参数,那么问题在于你。 (但是,通过False0,[],... 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将导致复杂的,令人困惑的错误;-)。

+0

谢谢 - 我没有意识到使用格式化字符串时需要考虑到这一点。 – mikewaters 2010-07-21 18:55:09

+0

@threecheese,不客气 - 我完全明确地提到它,因为我知道人们往往不去想它;-)。 – 2010-07-21 20:46:11

0

首先,我想你的意思

if spam is None: 

Breakfast(0)将布尔真为not spam的将是[]的说法,0.0''u''

其次,错误提出既是一个无信息的泛型类,而是一个更典型的ValueError。最后,例外文本可以提供更多信息,并引导呼叫者进行修复。

而且,正如其他人所指出的那样,您通过设置一个不存在的默认值来牺牲自动检查。