kondrackii
@kondrackii
1 + 1 = 11

Как переработать код алгоритма поиска объекта?

Написал такой алгоритм поиска, сначало, ищется подходящая папка, исходя из идентификатора получаемого объекта (obj), затем идет поиск по названию подходящей папки среди локального хранилища. Схема рабочая, но больше похоже на говно-код, может быть можно как-то ее более изящно и правильно переписать? Было бы славно объединить это в одно "действие"

FOLDERS = {
    "Geometry": {
        "color": #...,
        "icon":  #...,
        "ids": [
            5163, 
            5167, 
            5173,
            5168,
         ]
    }
}

folder_name = next(iter(filter(
        lambda name: obj.GetType() in FOLDERS[name]['ids'],
FOLDERS)), None)

folder = next(iter(filter(
       lambda folder: folder.GetName() == folder_name,
created_folders)), None)


created_folder - массив с хранящимися объектами (папками), объекты не обычные, а особый класс, который отдает API

функция GetType отдает int, это идентификатор объекта, такой на подобии как и в массиве
функция GetName отдает string, это именя объекта
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
@Vaskey
Можно упростить ваш алгоритм поиска объекта, объединив два шага (поиск папки по идентификатору объекта и поиск папки по имени) в один. Вместо того, чтобы хранить идентификаторы папок в словаре, можно использовать имена папок как ключи и хранить идентификаторы объектов в списке значений. Тогда вы можете использовать имя папки, чтобы найти соответствующий идентификатор объекта, а затем использовать это значение для поиска папки в массиве created_folders. Вот пример кода:
FOLDERS = {
    "Geometry": {
        "color": #...,
        "icon":  #...,
        "ids": [
            5163, 
            5167, 
            5173,
            5168,
         ]
    }
}

obj_type = obj.GetType()
folder_name = next((name for name, folder in FOLDERS.items() if obj_type in folder['ids']), None)
folder = next((folder for folder in created_folders if folder.GetType() == folder_name), None)


В этом примере мы сначала определяем идентификатор объекта, используя метод GetType(). Затем мы находим имя папки, которая соответствует этому идентификатору, с помощью генератора списков и функции next(). Затем мы находим папку, которая соответствует этому имени, с помощью того же подхода.

Этот подход более простой и легко читаемый, чем использование словаря FOLDERS с идентификаторами папок в качестве значений. Также он более гибкий, потому что вы можете легко добавлять новые папки и объекты в вашу программу, просто добавляя их имена и идентификаторы в словарь FOLDERS.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы