【发布时间】: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使用方法fn1和fn2 -
Class B使用方法fn2和fn3 -
Class C使用fn4... - 这样的课程大约有 15 节课。
所以当我调用obj_a.fn2() 时,我必须明确导入它可能引发的异常(它不在A、B 或C 类所在的模块中,而是在共享方法所在的另一个模块中)...我认为这有点烦人。除此之外,我正在努力的项目中的标准样式强制每行编写一个导入,因此它变得非常冗长。
在一些代码中,我看到存储为类属性的异常,我发现它非常有用,例如:
try:
obj.fn()
except obj.MyCoolError:
....
【问题讨论】:
-
拥有一个函数存储它可能的异常会让你有什么目的? “多态”抓?也许您可以解释一个用例,这样可以为您节省大量额外工作?
-
正如我所说,它可以让我在任何模块和任何条件下使用该函数(例如,该函数已作为方法添加到类中),无需导入即可访问其异常异常本身。
-
你经常传递函数吗?这是一个有趣的想法,但对于具体的函数,你通常会做类似
from module import function, MyCoolError的事情。对于类,它可能更有意义。 -
请注意,您也将有在文档中添加此事实。我从不认为可以通过这种方式访问异常。另外,考虑到您也可以传递异常,所以我真的不明白传递函数有什么意义,所以我真的不明白您的意思。我只是看到了实现相同效果的更冗长和复杂的方法。
-
@CorleyBrigman,在这种情况下,我有一些由某些类“不定期”共享的功能,(
A类有fn1和fn2,B类有fn1和fn3,类C仅限fn2等),并且为了避免 mixins 的爆炸,我更喜欢将我需要的方法附加到需要它的类中。也就是说,当我调用obj.fn1()时,我必须显式导入其可能的异常,我觉得这有点烦人。
标签: python function exception attributes