gpt4 book ai didi

Python、IoC、异常和松耦合

转载 作者:太空宇宙 更新时间:2023-11-04 05:50:47 25 4
gpt4 key购买 nike

假设我们有两个类,A 类 有一个经常抛出的自定义错误,这是其功能的一部分。

#a.py
class AError(Exception):
"""This exception flags a functional error"""
pass


class A(object):
def work(self):
"""Throws AError when it is tired"""
raise AError() #This exception is raised eventually, business code removed for clarity

B 类,它使用 A 类来执行一些操作。

#b.py
import a
class B(object):
def make_him_work(self, afected):
try:
afected.work()
except a.AError:
pass #This was expected, here will go some business logic

这很好用,但是当我有不同类型的 A 时,它就变成了一个问题。理想情况下,我想将 A 与 B 完全分离,这样我就可以传递任何像 A 这样满足相同接口(interface)的类,但我不能异常(exception)(因为它不是接口(interface)本身的一部分)

在 C++ 中,我会有一个头文件,其中包含我的接口(interface)定义以及具体类将实现的异常。这在 Python 中通常是如何解决的?或者换句话说,什么是最 Pythonic 的方法?

我想到了以下选项:


<强>1。创建带有异常的模块,可能还有基类/元类(C++/Java 方式)

#common.py
class AErrorBase(Exception):
pass


class AIface(object):
def work(self):
raise NotImplemented()

.

#a.py
import common
class AError(common.AErrorBase):
pass


class A(common.AIface):
def work(self):
"""Throws AError when it is tired"""
raise AError()

.

#b.py
import common
class B(object):
def make_him_work(self, afected):
try:
afected.work()
except common.AErrorBase:
pass #This was expected

<强>2。将异常作为参数传递

#a.py
class AError(Exception):
pass


class A(object):
def work(self):
"""Throws AError when it is tired"""
raise AError()

.

#b.py
class B(object):
def make_him_work(self, afected, ex_type):
try:
afected.work()
except ex_type:
pass #This was expected

<强>3。异常作为类的属性,因此它成为接口(interface)的一部分。

#a.py
class A(object):
def work(self):
"""Throws AError when it is tired"""
raise AError()
class AError(Exception):
pass

.

#b.py
class B(object):
def make_him_work(self, afected):
try:
afected.work()
except afected.AError:
pass #This was expected

<强>4。不要使用异常,只是一个返回码。 !C 天回来了!


还有其他选择吗?你觉得什么更“pythonic”?


编辑:添加注释以阐明异常的目的。需要在B中处理

注意:这可能完全是因为我正在用我的旧 C++ 背景来解决这个问题,我只是想知道当我们有异常时你如何在 python 中应用 IoC。随意说我所有的方法都是垃圾,我应该用另一种方式来做

最佳答案

我的类(class)看起来像这样:

class A(object):
def can_work(self):
"returns True if an A can work otherwise False (e.g. is an A is tired)"
return ...

def work(self):
assert not self._is_tired, "Test if self.can_work() first!"
...

这样您就可以让 A 的用户测试他们是否应该使用工作。断言对于调试和确保您或其他人没有忘记接口(interface)很有用。

B 类将按如下方式使用 A:

class B(object):
def make_him_work(self, afected):
if afected.can_work():
afected.work()

关于Python、IoC、异常和松耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30304237/

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