使用assert验证python中有关参数的假设是不好的做法吗?

Ben*_*rts 4 python

我正在编写一个类,它__init__使用id或slug参数,但不能同时使用.我想验证参数是否符合预期.使用一个assert用于验证关于参数的假设的特定目的是否合适和良好实践,或者如果参数不符合预期,我是否应该提出异常?

例如,

def __init__(self, id=None, slug=None):
    assert((id or slug) and not (id and slug))
Run Code Online (Sandbox Code Playgroud)

小智 9

原始问题的答案("使用断言来验证python中的内部假设是不好的做法?")绝对没有.这是每个人都同意断言有益的一件事.但是你在问题中描述的不是内部假设的验证:它是对外部输入的验证.A TypeError,a ValueError,另一个内置异常(或者可能是一个自定义异常,尽管应该保守一个)为API用户提供了更有用的反馈.更糟糕的是,断言可能(并且在某些环境中,通常是)被完全删除,这意味着您的代码将默默地做错事.

  • @BenRoberts:就你的功能而言,它是外部输入.你不希望你的函数对彼此做出太多假设.如果随机用户要输入它,就像验证一样. (3认同)

Bas*_*nen 7

如果这是关于代码健全性的,正如您所描述的那样,断言是正确的使用方法.如果这是关于输入验证,则不应使用assert.特别是,用户不应该通过向其提供垃圾来触发断言.断言只能由于程序中的错误而触发.

编辑:正如我刚刚从评论中学到的,Python还允许您完全关闭断言(意味着它们不会被评估,因此不会失败).这应该是正确的答案(除了使用像汇编或C这样的不同语言)到性能问题,如果有的话.