#python #dictionary
Вопрос:
У меня есть следующий код:
my_dict = {"function1" : function1, "function2" : function2}
def call_functions():
for key in my_dict.keys():
mydict[key]()
def function1():
print "hello 1"
def function2():
print "hello 2"
if __name__ == '__main__':
call_functions()
Я понимаю, что это должно сработать — в то время mydict
как объявляется до определения функций, python вызывает их на основе имени, а не на основе фактического указателя на функции. Поскольку к моменту запуска кода они действительно существуют (потому что это происходит через main), проблем быть не должно. Однако я получаю ужасную ошибку имени, сообщающую мне, что функция 1 не существует.
Если не считать объявления my_dict в конце файла (я бы хотел, чтобы глобальные файлы находились вверху, где они доступны пользователю), есть ли способ обойти это? Я не понимаю, так как к тому времени, когда я вызываю функцию, она уже объявлена
Комментарии:
1.
{"function1" : function1, "function2" : function2}
создает словарь перед созданием функций, поэтому при поиске функции 1 он выдает ошибку имени2. «Я не понимаю, так как к тому времени, когда я вызываю функцию, она была объявлена» — функция может существовать к моменту, когда вы пытаетесь ее вызвать , но она не существует, когда вы пытаетесь поместить ее в диктант. Вы не можете просто поместить недооцененные имена в диктант — этот код пытается оценить имена
function1
иfunction2
для создания диктанта, и эти имена еще ни к чему не приводят.3. Если python на самом деле не разрешится до момента вызова, почему его волнует, если он еще не существует ? Разве ошибка не должна возникать во время вызова, а не во время определения?
4. Что заставляет вас думать, что Python не пытается разрешить функцию, пока вы ее не вызовете?
5. Таково было мое понимание того, как работает python, основанное на предыдущем чтении, которое я сейчас не могу найти
Ответ №1:
При интерпретации первой строки на переменные «function1» и «function2» ссылаются, но их еще предстоит объявить, и поэтому, как вы видели, программа завершает работу.
Переместите объявления функций перед строкой my_dict, и это сработает. У вас также была опечатка, которую я исправил здесь. (mydict против my_dict)
def function1():
print("hello 1")
def function2():
print("hello 2")
my_dict = {"function1" : function1, "function2" : function2}
def call_functions():
for key in my_dict.keys():
my_dict[key]()
if __name__ == '__main__':
call_functions()
Редактировать: как предположил @chepner, если нет чего-то, выходящего за рамки этого контекста, что могло бы послужить веской причиной, хранение функций в словаре не требуется, если достаточно списка. См.Пример ниже.
def function1():
print("hello 1")
def function2():
print("hello 2")
my_list = {function1, function2}
def call_functions():
for func in my_list:
func()
if __name__ == '__main__':
call_functions()
Комментарии:
1. Другое предложение:
key
используется только для получения значенияmy_dict[key]
; вы можете выполнить итерациюmy_dict.values()
напрямую, чтобы вызвать функции для вызова. (Что ставит под сомнение , почему это аdict
, а не аlist
, но диктант может использоваться по-разному в коде, который не показан.)2. @chepner спасибо, я добавил это в качестве дополнения.