Python assert的使用场景是什么 - python

有人可以解释何时使用以及断言的 BEST SUITABLE 最佳使用情况是什么?

我的观点是:

  • 因为它只等于if not then raise
  • 在优化模式-O中,它将被忽略
  • 那么源代码中的assert使用场景是什么(不是单元测试)?

    从我的传统经验来看,assert应该只存在于单元测试中,实际上并不能说明为什么它开始越来越多地出现在Python项目代码中。

    参考方案

    在库代码中考虑断言语句的一种好方法是作为已加载的注释,这就像是一小段有关该文件如何工作(或您认为它如何工作)的文档,如果在“评论”曾经断言是错误的。

    何时使用断言?

    在将断言语句写入源代码(而非测试代码)时,无论程序输入如何,都应该确信该断言不会触发。当然,您不能百分百确定它永远不会触发,但是您应该确保,如果它会触发,那么您在某处做出了错误的假设,则需要重新查看本节代码。

    为什么完全将断言添加到库代码中?如果您确定他们不会开火,那有什么意义呢?

  • 因为您犯了错误并且您并不完美。使用断言可以来防止自己的错误。就像您锁上车门,然后尝试抬起车门把手以检查车门是否正常工作。
  • 如果您在某个地方犯了错误,它将阻止代码继续执行。普通的旧评论无法做到这一点。如果逻辑依赖于一些不正确的假设,则对该假设的正确编写的断言可以保护您免受代码的不安全执行的影响。这使成为代码的受控故障模式,而不是稍后以某种奇怪的方式显现的错误,从而更加难以找到根本原因。
  • 这是一种防御性编程形式,可用于防止将来发生变化! 这是个好把戏。将来您或其他从事项目工作的开发人员可能会在以后的提交中添加一些代码,这会使您一年前所做的假设无效。断言语句就像这里的路标,上面写着:“嘿,如果您更改了该内容,那么您也需要在此处进行更改”,并提请注意一些实现细节,否则可能容易错过。
  • 什么时候不使用断言

    不要使用它们来验证输入!如有必要,请使用例外。如果断言触发,就是一个错误。如果用户报告未处理的AssertionError,这是您的问题,而不是用户的错。需要修复某些问题。

    这是一个错误断言的示例:

    def square(n):
        assert isinstance(n, int)
        ...
    

    如果触发,那是呼叫者的错。如果需要,这里TypeError比未处理的AssertionError更合适。

    这是一个好的断言的例子:

    s = None
    while s not in {'y', 'n'}:
        s = input("do the thing? [y/n] ").lower()
    if s == 'y':
        # do the thing
    else:
        assert s == 'n'
        # do other stuff 
    

    它不会验证数据,即用户无法键入任何会引起断言触发的输入-开发人员在此处所做的“假设”是,由于while循环已退出,因此s必须为'y''n'。这比elif s == 'n':else: raise类型的构造更好,因为该else:块永远无法到达,因此除非您进行了一些真正的侵入式模拟,否则它不会接受测试覆盖。最后但并非最不重要的一点是,它可以防止在愚蠢的将来时错误地输入'n'分支的处理-向提示添加了6个选项,但仅添加了其中5个选项的处理(哎呀!)

    在返回'Response'(Python)中传递多个参数 - python

    我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

    Python exchangelib在子文件夹中读取邮件 - python

    我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

    python JSON对象必须是str,bytes或bytearray,而不是'dict - python

    在Python 3中,要加载以前保存的json,如下所示:json.dumps(dictionary)输出是这样的{"('Hello',)": 6, "('Hi',)": 5}当我使用json.loads({"('Hello',)": 6,…

    Python GPU资源利用 - python

    我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

    Python:图像处理可产生皱纹纸效果 - python

    也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…