Python 避免在内部循环中使用

Python 避免在内部循环中使用,python,Python,我在一个非常单一的功能中工作,但是我看到了一些我认为可以改进的东西,但是在考虑解决方案一段时间后,我没有找到它,所以也许你可以帮助我;这是我的密码: def my_function(metric_id, response_class_id, response_dict): response_metrics = db_session.query(ResponseMetric).filter(ResponseMetric.id == metric_id).all() respons

我在一个非常单一的功能中工作,但是我看到了一些我认为可以改进的东西,但是在考虑解决方案一段时间后,我没有找到它,所以也许你可以帮助我;这是我的密码:

def my_function(metric_id, response_class_id, response_dict):

    response_metrics = db_session.query(ResponseMetric).filter(ResponseMetric.id == metric_id).all()
    response_class = db_session.query(ResponseClass).filter(ResponseClass.response_class_id == response_class_id).first()

    for response_metric in response_metrics:
        if response_class.type == "structured":
            result  = response_dict["entries"][response_metric.name]["classes"][1]
        elif model.model_type == ModelTypeEnum.clf_multiclass.value:
            result = response_dict["entries"][response_class.model_name]["classes"][response_metric.name]
        
        ...
        a lot of things with the result
我得到了一个度量列表,然后对它们进行迭代以从dict中获得结果,但我也得到了一个响应类,该类指示我应该如何访问dict中的值,因为我有一个if语句,您可以看到,但是我注意到if语句不依赖于我正在迭代的项,所以我觉得在某种程度上我们可以避免if语句在循环中,并将其移动到前面,你怎么看

注: 另外,我认为在循环中使用eval函数之类的函数会带来更高的计算成本。

FWIW我认为在循环中使用if是完全可以的,但是如果您真的想避免它,比如如果您正在检查的条件计算起来更昂贵,那么您可以使用以下一种方法:

def my_function(metric_id, response_class_id, response_dict):

    response_metrics = db_session.query(ResponseMetric).filter(ResponseMetric.id == metric_id).all()
    response_class = db_session.query(ResponseClass).filter(ResponseClass.response_class_id == response_class_id).first()

    def structured_response_result(response_metric):
        return response_dict["entries"][response_metric.name]["classes"][1]

    def multiclass_model_result(response_metric):
        return response_dict["entries"][response_class.model_name]["classes"][response_metric.name]

    if response_class.type == "structured":
        result_func = structured_response_result
    elif model.model_type == ModelTypeEnum.clf_multiclass.value:
        result_func = multiclass_model_result
    else:
        return

    for response_metric in response_metrics:
        result = result_func(response_metric)
        
        ...
        a lot of things with the result

这个代码没有问题。试图将if语句拉到for循环之外只会使代码更难阅读。像这样的单个布尔比较非常便宜。没有理由试图使这段代码更优雅或其他什么。由于response_dict访问模式根据response_class.type的不同而变化,因此除了在循环外为response_dict[entries]提供别名之外,您实际上没有什么办法来清理代码。