如何在api调用期间有效地跟踪所有警告/消息,并返回与python输出相同的警告/消息?



方法1

warnings = list()
messages = list()
def calculate(a, b, method):
if isinstance(a, float):
warnings.append(f"a:{a} is float, converting it to int!")
a = int(a)
...
result = a + b
messages.append(f"result is {result}")
return result, {"warnings": warnings, "messages": messasges}

在上面的例子中,我有一个简单的函数calculate(),我在运行期间跟踪所有警告/消息,然后返回与实际结果相同的结果,因为假设我想将这些警告/消息与实际结果一起显示给UI上的最终用户。

另一种更好的方法是:

方法2

class Alerts():
def __init__():
self.warnings = list()
self.messages = list()
def calculate(a, b, method):
alrt = Alerts()
if isinstance(a, float):
alrt.warnings.append(f"a:{a} is float, converting it to int!")
a = int(a)
...
result = a + b
alrt.messages.append(f"result is {result}")
return result, alrt

在方法2中,通过在单个对象中定义它们来跟踪所有消息/警告更方便,这也允许在Alert()类中编写一些自定义方法来格式化消息/警告等。

潜在的问题

如果有几个方法调用涉及到一个api调用,那么我将不得不创建/维护这个Alert()对象到处和/或把它扔在我的方法中,以保持跟踪所有的警告/消息在一个单一的对象。

上述方法之一是实现这一目标的好方法吗?它还能更有说服力吗?

谢谢!

经过一番思考,下面是我能想到的最有说服力的方法。Calculate()是我的API函数,sum()是API运行中调用的一个内部方法。

# for handling results of any api, including errors/warnings/messages
class ResultHandler():
def __init__(self):
self.warnings = list()
self.messages = list()
self.errors = list()
self.result = dict()
def append_traceback(self):
pass
# to wrap the output of an api call in ResultHandler() object
def wrap_output(func):
def wrapper(*args, **kwargs):
rh = ResultHandler()
rh.messages.append("1: i am wrap_output!")
try:
kwargs["rh"] = rh
rh.result = func(*args, **kwargs)
except:
rh.append_traceback()
rh.messages.append("2: i am wrap_output!")
return rh
return wrapper
# an internal method call
def sum(rh):
print("sum")
rh.messages.append("i am sum!")
return 1
# api function
@wrap_output
def calculate(*args, **kwargs):
rh = kwargs["rh"]
rh.messages.append("1: i am calculate!")
out = sum(*args, **kwargs)
rh.messages.append("2: i am calculate!")
return out
# calling api
o = calculate()
print(o.messages)

最新更新