【问题标题】:Python: store expected Exceptions in function attributesPython:在函数属性中存储预期的异常
【发布时间】:2023-03-29 07:07:01
【问题描述】:

将函数的预期异常存储为函数本身的属性是pythonic吗?或者只是一个臭名昭著的坏习惯。

类似的东西

class MyCoolError(Exception):
    pass

def function(*args):
    """
    :raises: MyCoolError

    """
    # do something here
    if some_condition:
        raise MyCoolError

function.MyCoolError = MyCoolError

还有其他模块

try:
    function(...)
except function.MyCoolError:
    #...

专业人士:在我引用我的函数的任何地方,我也引用了它可能引发的异常,我不必显式导入它。

缺点:我“必须”重复异常的名称以将其绑定到函数。这可以通过装饰器完成,但也增加了复杂性。

编辑

为什么我这样做是因为我以不规则的方式将一些方法附加到某些类中,我认为在这些类中使用 mixin 是不值得的。我们称之为“量身定制的附加功能”。比如说:

  • Class A 使用方法 fn1fn2
  • Class B 使用方法 fn2fn3
  • Class C 使用 fn4 ...
  • 这样的课程大约有 15 节课。

所以当我调用obj_a.fn2() 时,我必须明确导入它可能引发的异常(它不在A、B 或C 类所在的模块中,而是在共享方法所在的另一个模块中)...我认为这有点烦人。除此之外,我正在努力的项目中的标准样式强制每行编写一个导入,因此它变得非常冗长。

在一些代码中,我看到存储为类属性的异常,我发现它非常有用,例如:

try:
    obj.fn()
except obj.MyCoolError:
    ....

【问题讨论】:

  • 拥有一个函数存储它可能的异常会让你有什么目的? “多态”抓?也许您可以解释一个用例,这样可以为您节省大量额外工作?
  • 正如我所说,它可以让我在任何模块和任何条件下使用该函数(例如,该函数已作为方法添加到类中),无需导入即可访问其异常异常本身。
  • 你经常传递函数吗?这是一个有趣的想法,但对于具体的函数,你通常会做类似from module import function, MyCoolError 的事情。对于类,它可能更有意义。
  • 请注意,您也将在文档中添加此事实。我从不认为可以通过这种方式访问​​异常。另外,考虑到您也可以传递异常,所以我真的不明白传递函数有什么意义,所以我真的不明白您的意思。我只是看到了实现相同效果的更冗长和复杂的方法。
  • @CorleyBrigman,在这种情况下,我有一些由某些类“不定期”共享的功能,(A 类有fn1fn2B 类有fn1fn3,类 C 仅限 fn2 等),并且为了避免 mixins 的爆炸,我更喜欢将我需要的方法附加到需要它的类中。也就是说,当我调用obj.fn1() 时,我必须显式导入其可能的异常,我觉得这有点烦人。

标签: python function exception attributes


【解决方案1】:

我认为它不是 Pythonic。我也认为它并没有比标准方式提供很多优势,标准方式应该只是将异常与函数一起导入。

Python 程序使用import 语句来说明其代码的来源是有原因的(除了帮助解释器);它有助于找到您正在使用的设施的代码(例如,在这种情况下您的异常)。

整个想法带有声明异常的味道,因为它在 C++ 中是可能的,而在 Java 中部分是强制性的。语言律师之间有讨论这是一个好主意还是一个坏主意,在 Python 世界中,设计者决定反对它,所以它不是 Pythonic。

这也引发了一大堆进一步的问题。如果您的函数 A 正在使用另一个函数 B 会发生什么,然后该函数 B 被更改,以便它可以抛出异常(在 Python 中是有效的事情)。您是否愿意更改您的功能 A 以反映这一点(或在 A 中捕获它)?您想在哪里划清界限——使用int(text) 将字符串转换为int 原因足以“声明”可以抛出ValueError

总而言之,我认为这不是 Pythonic,不。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2021-01-26
    • 2010-10-05
    相关资源
    最近更新 更多