Напишите функцию для сокращения дублирующегося кода

У меня есть два очень похожих цикла 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)
Вернуться на верх