在方法中使用assert-Python

在方法中使用assert-Python,python,exception-handling,assert,Python,Exception Handling,Assert,在方法中使用资产是一种不良做法吗 e、 g 有什么想法吗?没有 在您的示例中,如果您已经记录了add需要整数,assert在方法的开头使用此约束实际上是一个很好的实践 想象一下你还有其他选择,它们有多糟糕: 不要验证你的论点。这意味着,该方法稍后将失败,并出现一个奇怪的回溯,这可能会使调用者感到困惑,并迫使调用者查看add的实现,以了解发生了什么 请注意,尝试将输入转换为int——这是一个非常糟糕的主意,用户会一直想知道为什么add(2.4,3.1)会不断返回5 这没问题,因为您可以使用-O

在方法中使用资产是一种不良做法吗

e、 g


有什么想法吗?

没有

在您的示例中,如果您已经记录了
add
需要整数,
assert
在方法的开头使用此约束实际上是一个很好的实践

想象一下你还有其他选择,它们有多糟糕:

  • 不要验证你的论点。这意味着,该方法稍后将失败,并出现一个奇怪的回溯,这可能会使调用者感到困惑,并迫使调用者查看
    add
    的实现,以了解发生了什么
  • 请注意,尝试将输入转换为
    int
    ——这是一个非常糟糕的主意,用户会一直想知道为什么
    add(2.4,3.1)
    会不断返回
    5

    • 这没问题,因为您可以使用-O命令行选项运行应用程序,并且不会为assert语句生成代码

      更新:


      但是你也应该处理所有的错误。否则,剥离断言后可能会发生未处理的异常。(正如McConnell所建议的,请参阅他的引用)

      不是,但是如果您的代码包含的断言语句比实际代码多,那么我会很生气。

      与其使用断言并引发断言异常,不如使用instance()执行适当的检查并引发适当的类型错误。

      在这种情况下,你不想提出一个例外吗?我更喜欢仅在调试代码时使用断言。这当然取决于场合(特别是在动态类型语言中),但异常是针对运行时错误,而断言用于捕获编程错误。如果
      add
      的文档清楚地声明它只接受“int”,那么调用方有责任遵守此约束,任何违反约定的行为都是编程错误。(此外,Python中的
      assert
      会引发
      AssertionError
      ,因此引发异常实际上是语法错误)。是的,它会引发一个
      AssertError
      。在这种情况下,我只需提出
      TypeError
      ,但从语义上讲,断言意味着“这不可能是错误的”。无效的参数是非常可能的,并且应该引起一个适当的错误(例如<代码> TypeError < /代码>),它指示“某些数据是错误的”而不是“此代码被破坏”-而且,我考虑<代码>,除了AdvestError < /Cord>(在测试之外)。正是因为这个原因,这很难闻。为什么这是一个支持断言的论点呢?我的意思是断言是一种良好的实践,所以问题在于python脚本是否存在缺陷。糟糕的是,当脚本在“release”模式下运行时,会出现断言异常。然而,python允许您避免这种情况。但是像OP这样的代码使用断言进行参数验证——如果跳过断言,它可能会继续使用错误/虚假的值,并在稍后崩溃。我同意Thomas Owens在这里的回答:然后将其添加到回答中。这很重要。如果没有“无论如何处理错误”部分,剥离断言将导致错误代码。
      def add(x, y):
          assert isinstance(x, int) and isinstance(y, int)
          return x + y