def select_record(phonebook: pb.Phonebook, multiple_choice=False, index=False, firstname_lastname=False, firstname=False, lastname=False, phone=False, birthday=False) -> rec.SetRecords or None: """ Нахождение набора записей по любому количеству полей. В начале функции составляется меню полей исходя из входных параметров, а также добавляются нужные функции для ввода пользователем данных. Затем, согласно выбору пользователя, происходит ввод данных и нахождение и вывод нужного набора записей из данной телефонной книги. В случае успешной работы функции выводится набор записей (rec.SetRecords), иначе None. :param phonebook: данная телефонная книга, в которой происходит поиск нужного набора (pb.Phonebook) :param multiple_choice: флаг о типе выбора полей записи пользователем, множественный или однозначный (несколько полей или одно), (bool) :param index: флаг о выводе индекса в меню выбора (bool) :param firstname_lastname: флаг о выводе и имени, и фамилии в меню выбора (bool) :param firstname: флаг о выводе только имени в меню выбора (bool) :param lastname: флаг о выводе фамилии в меню выбора (bool) :param phone: флаг о выводе телефона в меню выбора (bool) :param birthday: флаг о выводе даты рожедения в меню выбора (bool) :return: если без ошибок, то rec.SetRecords, иначе None """ func_for_input = [] k = 0 menu = "You can select a record by the following criteria. " if multiple_choice: menu += "So, enter number or numbers of field:\n" else: menu += "So, enter number of field:\n" if index: menu += f"[{k}] select by index\n" func_for_input.append(("index", lambda: get_index(phonebook.get_amount_of_records()))) k += 1 if firstname_lastname: menu += f"[{k}] select by firstname and lastname\n" func_for_input.append(("firstname_lastname", getting_f_l_name)) k += 1 if firstname: menu += f"[{k}] select by firstname\n" func_for_input.append(("firstname", get_firstname)) k += 1 if lastname: menu += f"[{k}] select by lastname\n" func_for_input.append(("lastname", get_lastname)) k += 1 if phone: menu += f"[{k}] select by phone\n" func_for_input.append(("phone", get_phone)) k += 1 if birthday: menu += f"[{k}] select by birthday\n" func_for_input.append(("birthday", get_birthday)) k += 1 menu += f"[{k}] cancel\n" print(menu) if not multiple_choice: choice, err = get_unambiguous_choice(k) if err: return field, func = func_for_input[choice] if field == "index": print(phonebook) in_index, err = func() if err: return record = phonebook[in_index] if record is None: return return rec.SetRecords([record]) if field == "firstname_lastname": firstname, lastname = func() if firstname is None or lastname is None: return comparator = f"x.firstname == '{firstname}' and x.lastname == '{lastname}'" set_records = phonebook.get_records(comparator=lambda x: eval(comparator)) if set_records is None: return return set_records data, err = func() if err: return comparator = f"x.{field} == '{data}'" set_records = phonebook.get_records(comparator=lambda x: eval(comparator)) if set_records is None: return return set_records else: choices, err = get_multiple_choice(k) if err: return requests = [] for choice in choices: field, func = func_for_input[choice] data, err = func() if err: return comparator = f"x.{field} == '{data}'" requests.append(comparator) set_records = phonebook.get_records(comparator=lambda x: eval(" and ".join(requests))) if set_records is None: return return set_records