gpt4 book ai didi

Pythonic,自定义警告

转载 作者:太空狗 更新时间:2023-10-29 20:28:38 26 4
gpt4 key购买 nike

基本问题:制作我自己的自定义警告类的最 Pythonic/合乎逻辑的方法是什么?我应该继承哪些正确的警告和异常类?

动机:我正在编写的库的要求指定如果 MyContainer 对象 c 包含项目 x 并且库的调用者试图将 x 的“副本”——称之为 y —— 放入 c 中,a向调用者发出警告,并将 c.my_transformation_method(x, y) 的返回值放入 c 以替换 x。换句话说,MyContainer 将用它们的副本替换元素,但在这样做时必须警告用户。

根据我的阅读,警告库的调用者非致命操作的最灵活的方法是使用 warnings standard module .它允许调用者按照它认为合适的方式处理警告,从忽略警告到将它们视为错误。 (请注意,我使用的是 Python 3,但我不认为这对这里的问题至关重要。)

示例:我所做的是定义以下警告子类:

class DuplicateItemWarning(UserWarning, ValueError):
pass

然后 MyContaineradd() 方法在检测到尝试插入重复项。

具体问题:

  1. 我应该像上面那样对 UserWarning 进行子类化,还是只对 Warning 进行子类化?

  2. ValueError 的子类在语义上似乎是合理的(在上面的示例中,它只是在 Warning 之间的 MRO 中插入 ValueErrorException),以防调用者想将警告视为错误。这有什么我没有看到的缺点吗?

  3. 我在 StackOverflow 上找不到以前关于自定义警告类的问题。这是因为 Python 程序员甚至不喜欢使用 warnings 模块吗?

最佳答案

看完PEP 230关于警告框架和警告文档,我想我已经回答了你的问题:

  1. UserWarning 等都是警告类,除了分类,似乎没有别的作用。例如,您可以通过这种方式在生产环境中过滤掉它们。所以,基本上,如果警告不属于任何其他类别,您可以从 Warning 继承。如果在上下文中UserWarningRuntimeWarning 看起来足够了,就使用它们。

  2. 警告已经是异常。因此,从技术上讲,要将它们作为错误“捕获”,您只需更改过滤器,无需从任何 XXXError 继承。现在,这又是关于理解的。如果警告与传递的值有关,您可以从 ValueError 继承,特别是如果有许多不同的自定义警告,您会希望调用者一次“捕获”所有关于值的警告。

    try:
    # do something
    except MyCustomWarningOne:
    # do something else
    except MyCustomWarningTwo:
    # do something else also
    except ValueError: # or RuntimeWarning if you subclass from it
    # catch some other warning (both of these subclass from ValueError for example)
  3. warnings 模块是 Guido van Rossum 的想法。 (参见 PEP 230)。如果那还不够 Pythonic ... :D

关于Pythonic,自定义警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10321965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com