如何简化python函数?

时间:2019-06-07 17:54:02

标签: python json python-3.x

我想问问是否有人可以帮助我简化下面给出的代码。

函数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
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

以下是多余的位。

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方法,我假设dict实际上是items()

如果这是正确的,则可以使用字典理解来编写更紧张但仍可读的函数。您甚至可以取消data_to_save名称,并返回由字典理解表达式组成的字典,但是我发现它的可读性较差。

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
            }