gpt4 book ai didi

python - 如何将控件导航到顶级功能

转载 作者:太空宇宙 更新时间:2023-11-04 08:27:36 24 4
gpt4 key购买 nike

我被告知要在我的公司设计一个新的 API,而在编码实践方面我面临着两难境地。

我的 API 在运行之前必须进行多次检查,并且通常需要多个级别的函数才能运行。

一切都很好,直到这里。但是我的大部分检查(sub to sub to sub)函数都需要主 API 返回,而不做任何事情。几乎我所有的检查函数都必须返回一些数据,这些数据将被下一个检查函数使用,这就是我的问题所在。由于这种结构,我必须在每个检查函数结束时将状态与处理后的数据一起返回,并且在调用该函数后,我必须在进入下一个函数之前检查状态。

示例代码:

def check1a():
if some_process():
return True, data_positive
return False, data_negative
#data_positive and data_negative cannot be used to identify whether the check passed or not.

def check1():
stats,data = check1a()
if not status:
return False, data
status, data = check1b(data)
if not status:
return False, data
status, data = check1c(data)
if not status:
return False, data
return status, data

def mainAPI():
status, data = check1(data)
if not status:
return data
status, data = check2(data)
if not status:
return data
status, data = check3()
if not status:
return "Failed"
return data

作为“DRY”概念的虔诚追随者,如果觉得使用异常以以下方式运行代码将是最好的。

def check1a():
if some_process():
return data_positive
exception1a = Exception("Error in check 1 a")
exception.data = data_negative
raise exception

def check1():
data = check1a()
data = check1b(data)
data = check1c(data)
return data

def mainAPI():
try:
data = check1(data)
data = check2(data)
data = check3(data)
return data
except Exception as e:
return e.data #I know exceptions don't always have data, but this is an illustration of what I think I should implement

不幸的是,在代码中引发异常来实现这种工作在我的公司有点回避。

所以这是我的问题。

  1. 以这种方式使用异常真的是错误的吗?
  2. 以这种方式使用异常有已知的缺点吗?
  3. 是否有 pythonic(甚至是通用编码)方法允许我实现我的代码,并且不需要我停止遵循 DRY。

最佳答案

这可能不是一个很好的答案,其他人可以提供更多帮助。

尝试异常:

这是一个基于意见的话题。如果他们说他们不喜欢你像这样使用try exception,那么他们可能不相信“请求宽恕比许可更好”原则。

话虽这么说,抛出一个Exception 并不坏;但是捕获一般的 Exception 被认为是不好的。如果某个软件未按预期运行(即以某种未知方式),您希望它失败,因此您应该只捕获您想要捕获的特定 Exception

您可以在这里找到大量可行的异常,只需选择一个看起来合理的并使用它:Python Programming Exceptions

如果您不想捕获先前存在的异常之一,您可以随时创建自己的异常:

class MyAPIException(Exception):
def __init___(self, val):
self.val = val
Exception.__init__(self, "APIException with with arguments {0}".format(self.val))

def do_stuff(a,b,c):
raise MyAPIException({
'a' : a,
'b' : b,
'c' : c,
})

try:
do_stuff(1, 2, 3)
except MyAPIException as e:
print("API Exception:", e)

替代方案:

另一种可以帮助DRY 的方法是使用列表来调用电话。

def check1():
# List of functions you want to call in order
calls = [check1a, check1b, check1c]
for index, call in enumerate(calls):
# If it is the first function we will not pass any data
status, data = call() if index == 0 else call(data)
if not status:
return False, data
return status, data

如果您想返回每个函数调用的结果,此实现还可以轻松地将其实现为生成器。

关于python - 如何将控件导航到顶级功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55677032/

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