Можно ли заранее объявить функцию в Python? Я хочу отсортировать список, используя мою собственную cmp
функцию, прежде чем он будет объявлен.
print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])
Я организовал свой код, чтобы поместить определение cmp_configs
метода после вызова. Это терпит неудачу с этой ошибкой:
NameError: name 'cmp_configs' is not defined
Есть ли способ "заявить" cmp_configs
метод до его использования? Это сделало бы мой код чище?
Я предполагаю, что некоторые люди будут склонны сказать мне, что я должен просто реорганизовать свой код, чтобы у меня не было этой проблемы. Однако есть случаи, когда это, вероятно, неизбежно, например, при реализации некоторых форм рекурсии. Если вам не нравится этот пример, предположим, что у меня есть случай, в котором он действительно необходимо переслать объявление функции.
Рассмотрим случай, когда в Python необходимо объявить функцию вперед:
def spam():
if end_condition():
return end_result()
else:
return eggs()
def eggs():
if end_condition():
return end_result()
else:
return spam()
Где end_condition
и end_result
были предварительно определены.
Является ли единственным решением реорганизовать код и всегда ставить определения перед вызовами?
источник
main()
?import your_module
Что вы можете сделать, так это превратить вызов в собственную функцию.
Так что
сломается, но
будет работать правильно.
Общее правило
Python
заключается не в том, что функция должна быть определена выше в коде (как вPascal
), а в том, что она должна быть определена до ее использования.Надеюсь, это поможет.
источник
if __name__=="__main__":
решение работает.Если вы запускаете свой скрипт с помощью следующего:
тогда вам, вероятно, не нужно беспокоиться о таких вещах, как «предварительное объявление». Видите ли, интерпретатор загрузит все ваши функции и затем запустит вашу функцию main (). Конечно, убедитесь, что все операции импорта тоже правильные ;-)
Если подумать, я никогда не слышал такого понятия, как «предварительное объявление» в python ... но опять же, я могу ошибаться ;-)
источник
Если вызов cmp_configs находится внутри собственного определения функции, у вас все будет хорошо. Я приведу пример.
В целом, размещение вашего кода внутри функций (таких как main ()) решит вашу проблему; просто вызовите main () в конце файла.
источник
Я извиняюсь за возрождение этой темы, но здесь не обсуждалась стратегия, которая может быть применима.
Используя рефлексию, можно сделать что-то похожее на пересылку декларации. Например, допустим, у вас есть фрагмент кода, который выглядит следующим образом:
Таким образом, таким образом мы определили, какую функцию мы хотим вызвать до того, как она будет определена, по сути, предварительное объявление. В python утверждение
globals()[function_name]()
такое же, какfoo()
если быfunction_name = 'foo'
по причинам, рассмотренным выше, поскольку python должен искать каждую функцию перед ее вызовом. Если использоватьtimeit
модуль, чтобы увидеть, как эти два оператора сравниваются, они имеют одинаковую вычислительную стоимость.Конечно, приведенный здесь пример очень бесполезен, но если нужно иметь сложную структуру, которая необходима для выполнения функции, но должна быть объявлена раньше (или структурно не имеет смысла иметь ее впоследствии), можно просто сохранить строку и попробуйте вызвать функцию позже.
источник
В питоне нет такой вещи, как предварительное объявление. Вы просто должны убедиться, что ваша функция объявлена до того, как она понадобится. Обратите внимание, что тело функции не интерпретируется, пока функция не будет выполнена.
Рассмотрим следующий пример:
Вы можете думать, что тело функции - это просто другой скрипт, который будет интерпретироваться после вызова функции.
источник
Нет, я не верю, что в Python есть способ объявить функцию вперед.
Представьте, что вы интерпретатор Python. Когда вы доберетесь до линии
либо вы знаете, что такое cmp_configs, либо нет. Чтобы продолжить, вы должны знать cmp_configs. Неважно, есть ли рекурсия.
источник
Иногда алгоритм проще всего понять сверху вниз, начиная с общей структуры и углубляясь в детали.
Вы можете сделать это без предварительных деклараций:
источник
Вывод:
источник
Вы не можете заранее объявить функцию в Python. Если у вас есть логика, выполняемая до того, как вы определили функции, у вас, вероятно, возникнут проблемы. Поместите свое действие в
if __name__ == '__main__'
конец скрипта (выполнив функцию, которую вы называете «основной», если она нетривиальна), и ваш код станет более модульным, и вы сможете использовать его как модуль, если вам когда-нибудь понадобится к.Кроме того, замените это понимание списка генератором express (то есть,
print "\n".join(str(bla) for bla in sorted(mylist, cmp=cmp_configs))
)Кроме того, не используйте
cmp
, что не рекомендуется. Используйтеkey
и предоставьте менее чем функцию.источник
Импортируйте сам файл. Предполагая, что файл называется test.py:
источник
«просто реорганизовать мой код, чтобы у меня не было этой проблемы». Верный. Легко сделать. Всегда работает.
Вы всегда можете предоставить функцию до ее ссылки.
«Однако бывают случаи, когда это, вероятно, неизбежно, например, при реализации некоторых форм рекурсии»
Не вижу, как это возможно даже отдаленно. Пожалуйста, приведите пример места, где вы не можете определить функцию до ее использования.
источник
Теперь подожди минутку. Когда ваш модуль достигает оператора print в вашем примере, до того как
cmp_configs
он был определен, что именно вы ожидаете от него?Если ваша публикация вопроса с использованием печати действительно пытается представить что-то вроде этого:
тогда нет необходимости определять
cmp_configs
перед выполнением этого оператора, просто определите его позже в коде, и все будет хорошо.Теперь, если вы пытаетесь сослаться
cmp_configs
на лямбду в качестве значения по умолчанию для аргумента, тогда это другая история:Теперь вам нужна
cmp_configs
переменная, определенная до того, как вы достигнете этой строки.[РЕДАКТИРОВАТЬ - следующая часть оказывается неверной, поскольку значение аргумента по умолчанию будет назначено при компиляции функции, и это значение будет использоваться, даже если вы измените значение cmp_configs позже.]
К счастью, Python быть настолько типа размещения , как это, не важно , что вы определяете , как
cmp_configs
, так что вы можете просто предисловие с этим утверждением:И компилятор будет счастлив. Просто не забудьте объявить реальное,
cmp_configs
прежде чем вы когда-либо призыватьfn
.источник
Одним из способов является создание функции-обработчика. Определите обработчик на ранней стадии и поместите обработчик ниже всех методов, которые вам нужно вызывать.
Затем, когда вы вызываете метод-обработчик для вызова ваших функций, они всегда будут доступны.
Обработчик может принять аргумент
nameOfMethodToCall
. Затем использует кучу операторов if для вызова правильного метода.Это решит вашу проблему.
источник
Да, мы можем проверить это.
вход
Вывод
Как упомянул BJ Homer в приведенных выше комментариях, общее правило в Python заключается не в том, что функция должна быть определена выше в коде (как в Pascal), а в том, что она должна быть определена до ее использования.
Надеюсь, это поможет.
источник
print_lyrics()
вызывается (используется) в строке 1, прежде чем он будет определен? Я скопировал этот кусок кода и попытался запустить его, и он выдает ошибкуNameError: name 'print_lyrics' is not defined
в строке 1. Вы можете это объяснить?