Skip to main content
 首页 » 编程设计

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

2025年05月04日22lori

我被告知要在我的公司设计一个新的 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 

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