代码之家  ›  专栏  ›  技术社区  ›  mikewaters

在python中验证构造函数参数

  •  0
  • mikewaters  · 技术社区  · 14 年前

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

    我对这门语言不熟悉,正在使用 raise :

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

    这是愚蠢的,还是什么?

    谢谢!

    5 回复  |  直到 14 年前
        1
  •  4
  •   presto8    14 年前

    如果您只是试图确保传递了必需的参数,只需保留默认值。如果缺少参数,python将自动抛出typeerror。

    def __init__( self, spam, eggs=0 )
    
        2
  •  3
  •   Amber    14 年前

    如果参数不是可选的,为什么要为其提供默认参数?如果没有传递没有默认值的参数,python解释器会自动引发错误。

        3
  •  3
  •   Alex Martelli    14 年前

    在您的具体示例中,最简单的方法是 spam 一个默认值——如果用户忘记传递这个参数,那么python将为您诊断这个问题。(但是,通过 False , 0 , [] ,…作为 垃圾邮件 对于Python来说是可以的,所以如果您对它们有需求,您可能需要另外指定自己的语义检查)。

    如果您确实需要执行任何诊断,那么在诊断失败时引发异常是明智的。然而,这应该是适当的例外——例如, ValueError 如果该值是可接受的类型,但不能作为其特定值接受——并且带有清晰、完整的消息。所以,总结一下:

    class Breakfast(object):
        def __init__(self, spam, eggs=0):
            if not spam:
                raise ValueError("falsish spam %r not acceptable" % (spam,))
    

    (你需要包装 垃圾邮件 在单个项元组中 (spam,) 这里,否则传递一个空元组作为 垃圾邮件 会导致一个复杂、混乱的错误;-)。

        4
  •  0
  •   extraneon    14 年前

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

    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")
    
        5
  •  0
  •   msw    14 年前

    首先,我认为你的意思是

     if spam is None:
    

    作为 Breakfast(0) 对于 not spam 就像一个争论 [] , 0.0 , '' , u'' 等。

    其次,所产生的错误是一个非格式化的泛型类,而不是一个更典型的类。 ValueError . 最后,异常文本可以提供更多信息,并引导调用者进行修复。

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