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]提供别名之外,您实际上没有什么办法来清理代码。