Есть ли способ ссылаться на имя ключа во время определения значения ключа? Например:
cmds = {"DO1": get_data(key), "DO2": get_data(key), ...}
Если он доступен, каждый key
будет заменен на "DO1"
, "DO2"
, ...:
print(cmds)
{"DO1": get_data("DO1"), "DO2": get_data("DO2"), ...}
Как мне реализовать эту идею? Я хочу сохранить в словаре любой вызов функции, даже условия.
«ровные условия»: какие условия? «вызов любой функции»: но ваш пример дает одну функцию (get_data
) для всех клавиш. Разве это не ваш сценарий?
@jonrsharpe Сначала я так подумал, но вот 4 шаблона. Поэтому я подумал об этом в поисках другого хорошего или эффективного способа.
Если бы я мог настроить этот код, я бы хотел добавить простые условия, например value == "1"
. Но в этом контенте я не упомянул, потому что, по моему мнению, это не главный вопрос.
@simryang каждая ваша команда выполняет разную работу, поэтому для каждой вам нужно создать отдельную функцию и вызывать функцию на основе ее cmd.
Кроме того, вы можете просто ввести строку дважды. Есть сценарии, в которых просто "DO1": get_data("DO1")
лучше, чем пытаться любой ценой быть СУХИМ на 100%.
@Jeyekomon Если мне придет время отказаться от стремления к оптимизации, думаю, ваш совет поможет мне не терять время зря. Дай мне подумать об этом еще немного. Огромное спасибо за предыдущий и текущий советы.
Для этого вы можете использовать словарное понимание:
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. если другого способа не существует, я воспользуюсь им
#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
для вызова методов?
спасибо @Lrx за ответ. ваша идея о методе имени cmd и getattr выглядит хорошо.
@Sharim09 Sharim09 Это происходит потому, что в исходном коде simryang (до того, как он был отредактирован и обрезан) были вложенные операторы if внутри определенного класса, который они использовали. И действительно, вы правы, я не создавал экземпляр CommandHandler, теперь это исправлено.
Не в этом синтаксисе, но почему бы и нет, например.
{key: get_data(key) for key in ...}
?