簡體   English   中英

如何簡化python函數?

[英]How to simplify python function?

我想問問是否有人可以幫助我簡化下面給出的代碼。

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

以下是冗余位。

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
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM