Могу ли я ссылаться на имя ключа в определении значения dict?

Есть ли способ ссылаться на имя ключа во время определения значения ключа? Например:

cmds = {"DO1": get_data(key), "DO2": get_data(key), ...}

Если он доступен, каждый key будет заменен на "DO1", "DO2", ...:

print(cmds)
{"DO1": get_data("DO1"), "DO2": get_data("DO2"), ...}

Как мне реализовать эту идею? Я хочу сохранить в словаре любой вызов функции, даже условия.

Не в этом синтаксисе, но почему бы и нет, например. {key: get_data(key) for key in ...}?

jonrsharpe 08.07.2024 09:13

«ровные условия»: какие условия? «вызов любой функции»: но ваш пример дает одну функцию (get_data) для всех клавиш. Разве это не ваш сценарий?

trincot 08.07.2024 09:13

@jonrsharpe Сначала я так подумал, но вот 4 шаблона. Поэтому я подумал об этом в поисках другого хорошего или эффективного способа.

simryang 08.07.2024 09:37

Если бы я мог настроить этот код, я бы хотел добавить простые условия, например value == "1". Но в этом контенте я не упомянул, потому что, по моему мнению, это не главный вопрос.

simryang 08.07.2024 09:39

@simryang каждая ваша команда выполняет разную работу, поэтому для каждой вам нужно создать отдельную функцию и вызывать функцию на основе ее cmd.

Sharim09 08.07.2024 09:41

Кроме того, вы можете просто ввести строку дважды. Есть сценарии, в которых просто "DO1": get_data("DO1") лучше, чем пытаться любой ценой быть СУХИМ на 100%.

Jeyekomon 08.07.2024 10:15

@Jeyekomon Если мне придет время отказаться от стремления к оптимизации, думаю, ваш совет поможет мне не терять время зря. Дай мне подумать об этом еще немного. Огромное спасибо за предыдущий и текущий советы.

simryang 08.07.2024 10:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для этого вы можете использовать словарное понимание:

keys = ["DO1", "DO2", "DO3"]  # Add more keys if you have 
cmds = {key: get_data(key) for key in keys} 

Если вы просто хотите сохранить функцию (не хотите вызывать ее во время создания словаря), вы тоже можете это сделать:

keys = ["DO1", "DO2", "DO3"]  # Add more keys if you have 
cmds = {key: lambda k=key: get_data(k) for key in keys} 

спасибо @Sharim09. если другого способа не существует, я воспользуюсь им

simryang 08.07.2024 09:52
Ответ принят как подходящий

#1 Определите свой словарь по пониманию:

keys = ['DO1', 'DO2', ...]
cmds = {key: get_data(key) for key in keys}

№2 Да, он существует. Это более чистый способ заполнения словаря, поскольку имя ключа является избыточным. Вы можете изменить (статически или динамически) список keys, чтобы изменить словарь.

#3 Также, чтобы сделать остальную часть вашего кода немного чище, вы можете разделить свой код на разные модули и/или объекты.

Например, вы можете создать обработчик, методы которого являются явным именем вашего cmds («cmd1», «cmd2...»).

#handler.py
class commandHandler:
    def cmd1(self, pyqt_object, data_string):
        pyqt_object.cmd1_btn.setText(data_string)
    
    def cmd2(self, pyqt_object, data_string):
        pyqt_object.cmd2_drop.setCurrentIndex(int(data_string))

    def cmd3(self, pyqt_object, data_string):
        pass #and so on...

Между тем, в исходном файле вы можете использовать этот обработчик с функцией getattr:

#your original file
command_handler = commandHandler()
cmds = ['cmd' + str(i) for i in range(1, N+1)] #N being the number of commands
for cmd in cmds:
    if cmd in data:
        getattr(command_handler, cmd)(self, data[cmd])

Таким образом, у вас будет более универсальный и повторно используемый код. Чтобы добавить функцию cmd, вам просто нужно добавить метод в свой обработчик.

Почему вы пропускаете self при вызове методов? Кроме того, я думаю, вы забыли создать экземпляр класса commandHandler для вызова методов?

Sharim09 08.07.2024 09:31

спасибо @Lrx за ответ. ваша идея о методе имени cmd и getattr выглядит хорошо.

simryang 08.07.2024 09:49

@Sharim09 Sharim09 Это происходит потому, что в исходном коде simryang (до того, как он был отредактирован и обрезан) были вложенные операторы if внутри определенного класса, который они использовали. И действительно, вы правы, я не создавал экземпляр CommandHandler, теперь это исправлено.

Lrx 08.07.2024 10:10

Другие вопросы по теме