Python:在函数属性中存储预期的异常

Python:在函数属性中存储预期的异常,python,function,exception,attributes,Python,Function,Exception,Attributes,将函数的预期异常存储为函数本身的属性是pythonic吗?或者只是一种糟糕的做法 像这样的 class MyCoolError(Exception): pass def function(*args): """ :raises: MyCoolError """ # do something here if some_condition: raise MyCoolError function.MyCoolError = MyCo

将函数的预期异常存储为函数本身的属性是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:
    #...
Pro:无论我在哪里引用我的函数,我都会引用它可能引发的异常,我不必显式导入它

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

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

  • A类
    使用方法
    fn1
    fn2
  • B类
    使用方法
    fn2
    fn3
  • C类
    使用
    fn4
  • 像这样大约15节课
因此,当我调用
obj_a.fn2()
时,我必须显式导入它可能引发的异常(它不是在类a、B或C所在的模块中,而是在共享方法所在的另一个模块中)。。。我觉得这有点烦人。显然,我正在使用的项目中的标准样式强制每行编写一个导入,因此它变得非常冗长

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

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

我认为这不是蟒蛇式的。我还认为,与标准方法相比,它没有提供很多优势,标准方法应该是将异常与函数一起导入

Python程序使用
import
语句来说明代码的来源是有原因的(除了帮助解释器);它有助于查找您正在使用的设施的代码(例如,本例中的异常)

整个想法都有异常声明的味道,因为它在C++中是可能的,在java中是部分强制的。语言律师们正在讨论这是一个好主意还是一个坏主意,在Python世界中,设计师们决定反对它,因此它不是Python的

它还提出了一大堆进一步的问题。如果您的函数A使用的是另一个函数B,那么会发生什么情况?该函数随后会被更改,以便抛出异常(在Python中是有效的)。你是否愿意改变你的函数A来反映这一点(或者在A中捕捉它)?您想在何处划清界限?是否使用
int(text)
将字符串转换为int,原因足以“声明”可以抛出
ValueError


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

让函数存储其可能的异常会让你达到什么目的?“多态”捕捉?也许您可以解释这样一个用例,它可以为您节省大量额外的工作?正如我所说,它可以让我在任何模块和任何条件下使用该函数(例如,该函数已作为一个类的方法添加),无需导入异常即可访问其异常。您是否经常传递函数?这是一个有趣的想法,但对于具体的函数,您通常只需要从模块导入函数执行类似于
的操作,而不是mycolerror
。对于类来说,这可能更有意义。请注意,您还必须在文档中添加这一事实。我从来没有想过异常是可以通过这种方式访问的。另外,考虑到你也可以传递异常,我真的不明白传递函数有什么意义,所以我真的不明白你的观点。我只是看到了一种更详细、更复杂的方法来达到同样的效果。@CorleyBrigman,在这种情况下,我有一些函数“不规则地”被一些类共享,(class
A
fn1
fn2
,class
B
fn1
fn3
,class
C
只有
fn2
,等等),为了避免混合的爆发,我更喜欢将我需要的方法附加到需要它的类中。也就是说,当我调用
obj.fn1()
,我必须显式导入其可能的异常,这让我觉得有点烦人。