我想问问是否有人可以帮助我简化下面给出的代码。
函数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
}
}
}
}
}
答案 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
}