Напишите функцию для сокращения дублирующегося кода
У меня есть два очень похожих цикла for, я хочу иметь внутреннюю функцию для сокращения дублирующихся кодов, они выглядят так:
team_members = TeamMember.objects.all()
managers = Manager.objects.all()
for m in managers:
name = f"{m.name.first_name} {m.name.last_name}"
//reset of the code are the same
for t in team_members:
name = f"{t.member.first_name} {t.member.last_name}"
//reset of the code are the same
Проблема в том, что кверисеты managers и team_members имеют разные имена полей для имен людей. Если я хочу написать внутреннюю функцию, как решить проблему разных имен полей?
вы можете передать m.name
и t.member
в эту функцию, что позволит ей получить доступ к этому элементу.
for m in managers:
func(m.name)
for t in team_members:
func(t.member)
def func(member):
name = f'{member.first_name} {member.last_name}
#Rest of code
Решение Тома Карзеса в коде:
team_members = TeamMember.objects.all()
managers = Manager.objects.all()
for group, attr_name in zip([team_members, managers], ['name', 'member']):
for person in group:
name = f"{getattr(person, attr_name).first_name} {getattr(person, attr_name).last_name}"
Вот внутренняя функция, которая будет принимать objs в качестве входных данных и извлекать значения на основе атрибутов объектов.
def inner_fun(objs):
for obj in objs:
if hasattr(obj, 'name'):
name_obj = getattr(obj, 'name')
else:
name = getattr(obj, 'member')
name = f"{name_obj.first_name} {name_obj.last_name}"
return name
team_members = TeamMember.objects.all()
managers = Manager.objects.all()
team_name = inner_fun(team_members)
manager_name = inner_fun(managers)