如何简化python函数?

2024-04-20 08:53:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想问一下是否有人能帮我简化下面给出的代码。你知道吗

函数save_session()创建带有嵌套字典的字典,这些字典稍后会转储到.json文件中。数据示例如下所示的函数代码。你知道吗

我知道这看起来不太好,我几乎可以肯定有更好的方法来获得同样的结果。如有任何建议或提示,我将不胜感激。你知道吗

def save_session():
    """Exports current data to .json file."""
    data_to_save = {}

    # add workout plans
    for workout in workouts_instances:
        data_to_save[workout.name] = {}

        # add trainings
        if workout.trainings:
            data_to_save[workout.name]["trainings"] = {}

            for training in workout.trainings:
                data_to_save[workout.name]["trainings"][training.name] = {}

                # add training exercises
                if training.exercises:
                    data_to_save[workout.name]["trainings"][training.name]['exercises'] = {
                        exercise.name: {} for exercise in training.exercises
                    }

                    for exercise in training.exercises:

                        if exercise.details:
                            data_to_save[workout.name]["trainings"][training.name]['exercises'][exercise.name][
                                'details'] = {detail: value for detail, value in
                                              exercise.details.items()}

        # add exercises
        if workout.exercises:
            data_to_save[workout.name]["exercises"] = {}

            exercises_to_save = data_to_save[workout.name]["exercises"]

            for exercise in workout.exercises:
                exercises_to_save[exercise.name] = {}

                if exercise.details:
                    details = exercise.details
                    exercises_to_save[exercise.name]['details'] = {detail: value for detail, value in details.items()}
{
    "FBV - Full Body Workout": {
        "description": "short decription",
        "trainings": {
          "Training A": {
            "exercises": {
              "squats": {
                "details": {
                  "description": "squats with barbell",
                  "series": 4,
                  "repeats": 4
                  "load": 70
                }
              }
            }
          }
        },
        "exercises": {
            "some exercise name": {
                "details": {
                    "description": "some description",
                    "series": 5,
                    "repeats": 5,
                    "load": 60
                }
            },
            "bench press - wide": {
                "details": {
                    "description": "bench press with wide grip",
                    "series": 5,
                    "repeats": 5,
                    "load": 60
                }
            }
        }
    }
}


Tags: tonameinaddfordataifsave
1条回答
网友
1楼 · 发布于 2024-04-20 08:53:55

以下是冗余位。你知道吗

data_to_save[workout.name]["trainings"][training.name]['exercises'][exercise.name][
                                'details'] = {detail: value for detail, value in
                                              exercise.details.items()}

这和我的想法是一样的


 data_to_save[workout.name]["trainings"][training.name]['exercises'][exercise.name]['details'] = exercise.details

相同

exercises_to_save[exercise.name]['details'] = {detail: value for detail, value in details.items()}

可以写成

exercises_to_save[exercise.name]['details'] = details

我假设details实际上是读取在它上面调用的items()方法得到的dict。你知道吗

如果这是正确的,那么可以使用字典理解编写一个更时态但仍然可读的函数。您甚至可以去掉data_to_save名称并返回一个完全由dictionary comprehension表达式组成的dictionary,但我发现它的可读性较差。你知道吗

def save_session():
    """Exports current data to .json file."""
    data_to_save = defaultdict(dict)

    # add workout plans
    for workout in workouts_instances:
        # add trainings
        if workout.trainings:
            data_to_save[workout.name]["trainings"] = {
                training.name: {
                    'exercises': {
                        exercise.name: exercise.details
                        for exercise in training.exercises
                        if exercise.details
                    }
                } if training.exercises else {}
                for training in workout.trainings
            }
        # add exercises
        if workout.exercises:
            data_to_save[workout.name]['exercises'] = {
                exercise.name: {
                    'details': exercise.details
                }
                if exercise.details else {}
                for exercise in workout.exercises
            }

相关问题 更多 >