циклах for заполняются два словаря по одной и той же логике: https://dpaste.org/39ZA
Как можно отрефакторить код, чтобы избежать повторения участков (двух циклов, выполняющих похожие действия)? Правильно ли будет вынести что-то в функцию?
да, достаточно передать аргуаментом последовательность, по которой функция будет итерироваться и вернуть из функции словарь.
а что тут происходит вообще? почему это словари и т.п.
def your_function_name(objects): result = {} for obj in objects: ... return result
Есть пара списков объектов (читай датаклассов), у которых есть атрибуты name. Нужно сопоставить эти объекты между списками по их именам. При этом иногда нужно сопоставлять по именам, игнорируя регистр букв и пробелы в именах. Сначала я создаю эти словари, а потом кортеж кортежей из них, в каждом кортеже два сопоставленных датаклассса (или None, если где-то не нашлось пары): comparison_items = tuple( (component_templates_dict.get(component_name), components_dict.get(component_name)) for component_name in sorted(set().union(component_templates_dict.keys(), components_dict.keys())) )
def get_key(settings): def key(obj): res = obj.name if settings.ignore_case: res = res.casefold() if settings.igno_space: res = res.replaces(" ", "") return res return key def collect(components, key): return {key(obj): obj for obj in components} component_templates_dict = collect(comparison_component_templates, get_key(settings)) components_dict = collect(comparison_component_templates, get_key(settings))
а через получение имени переменной и последующего сравнения с приведением к апперу или подобном
Обсуждают сегодня