Действительно ли возможно передать - объявляют функцию в Python?

Насколько я знаю, Обновление (наряду с Cookie Набора и возможно некоторыми другими собственными псевдозаголовками) были созданы Netscape в еще начальном этапе Интернета и был в основном (но не совсем) стандарт с тех пор. Поскольку примерно каждый поддержка браузера это, Обновление довольно безопасно использовать - и обычно.

я предполагаю, что это никогда не становилось частью официальных стандартов, потому что у них уже были условия для этого с кодами статусов.

165
задан Eric Leschinski 5 January 2014 в 02:04
поделиться

9 ответов

Если вы не хотите определять функцию до , она используется, а определение ее после невозможно, как насчет определения ее в каком-то другом module?

Технически вы все равно сначала определяете его, но он чистый.

Вы можете создать рекурсию, как показано ниже:

def foo():
    bar()

def bar():
    foo()

Функции Python анонимны, как и значения, но они могут быть привязаны к имени.

В приведенном выше коде foo () не вызывает функцию с именем foo, она вызывает функцию, которая привязана к имени foo в точке звонок сделан. Можно переопределить foo где-нибудь еще, и тогда bar вызовет новую функцию.

Ваша проблема не может быть решена, потому что это '

73
ответ дан 23 November 2019 в 21:09
поделиться

Вы не можете напрямую объявить функцию в Python. Если у вас есть логика, выполняющаяся до того, как вы определили функции, у вас, вероятно, все равно есть проблема. Поместите свое действие в if __name__ == '__main __' в конце вашего скрипта (выполнив функцию, которую вы называете «main», если она нетривиальная), и ваш код будет более модульным, а вы ' Я смогу использовать его в качестве модуля, если вам когда-нибудь понадобится.

Также замените это понимание списка генератором выражения (например, print "\ n" .join (str (bla) for bla in sorted (mylist, cmp = cmp_configs)) )

Также не используйте cmp , который устарел. Используйте клавишу и укажите функцию «меньше».

3
ответ дан 23 November 2019 в 21:09
поделиться

Теперь подождите минуту. Когда ваш модуль достигает оператора печати в вашем примере, до того как было определено cmp_configs , что именно вы ожидаете от него?

Если ваша публикация вопроса с использованием print действительно пытается представить что-то вроде этого:

fn = lambda mylist:"\n".join([str(bla)
                         for bla in sorted(mylist, cmp = cmp_configs)])

тогда нет необходимости определять cmp_configs перед выполнением этого оператора, просто определите его позже в коде, и все будет хорошо.

Теперь, если вы пытаетесь ссылаться на cmp_configs в качестве значения по умолчанию аргумента лямбда, тогда это другая история:

fn = lambda mylist,cmp_configs=cmp_configs : \
    "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])

Теперь вам нужна переменная cmp_configs , определенная до того, как вы дойдете до этой строки.

[РЕДАКТИРОВАТЬ - эта следующая часть оказывается неправильной, поскольку значение аргумента по умолчанию будет присвоено при компиляции функции, и это значение будет использоваться, даже если вы измените значение cmp_configs позже.]

К счастью, Python, будучи настолько адаптивным к типам, не заботится о том, что вы определяете как cmp_configs , поэтому вы можете просто предисловие с этим утверждением:

cmp_configs = None

счастливый. Просто не забудьте объявить настоящие cmp_configs , прежде чем вызывать fn .

.
0
ответ дан 23 November 2019 в 21:09
поделиться

«просто реорганизуйте мой код, чтобы у меня не было Эта проблема." Верный. Легко сделать. Всегда работает.

Вы всегда можете указать функцию до ссылки на нее.

«Однако бывают случаи, когда это, вероятно, неизбежно, например, при реализации некоторых форм рекурсии»

Не понимаю, как это даже отдаленно возможно. Приведите пример места, где вы не можете определить функцию до ее использования.

0
ответ дан 23 November 2019 в 21:09
поделиться

В Python нет такой вещи, как предварительное объявление. Вам просто нужно убедиться, что ваша функция объявлена ​​до того, как она понадобится. Обратите внимание, что тело функции не интерпретируется до тех пор, пока функция не будет выполнена.

Рассмотрим следующий пример:

def a():
   b() # won't be resolved until a is invoked.

def b(): 
   print "hello"

a() # here b is already defined so this line won't fail.

Вы можете подумать, что тело функции - это просто еще один сценарий, который будет интерпретироваться после вызова функции. .

7
ответ дан 23 November 2019 в 21:09
поделиться

Нет, я не верю, что есть какой-либо способ объявить функцию в Python.

Представьте, что вы интерпретатор Python. Когда вы дойдете до строки

print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])

, вы либо знаете, что такое cmp_configs, либо нет. Чтобы продолжить, вам нужно знаю cmp_configs. Не имеет значения, есть ли рекурсия.

7
ответ дан 23 November 2019 в 21:09
поделиться

Если вызов cmp_configs находится внутри определения его собственной функции, все должно быть в порядке. Я приведу пример.

def a():
  b()  # b() hasn't been defined yet, but that's fine because at this point, we're not
       # actually calling it. We're just defining what should happen when a() is called.

a()  # This call fails, because b() hasn't been defined yet, 
     # and thus trying to run a() fails.

def b():
  print "hi"

a()  # This call succeeds because everything has been defined.

В общем, размещение кода внутри функций (таких как main ()) решит вашу проблему; просто вызовите main () в конце файла.

10
ответ дан 23 November 2019 в 21:09
поделиться

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

Так что

foo()

def foo():
    print "Hi!"

сломается, но

def bar():
    foo()

def foo():
    print "Hi!"

bar()

будет работать правильно.

Общие Правило в Python - это не , что функция должна быть определена выше в коде (как в Pascal ), но что она должна быть определена перед ее использованием.

]Надеюсь, это поможет.

101
ответ дан 23 November 2019 в 21:09
поделиться

Если вы запускаете свой скрипт следующим образом:

if __name__=="__main__":
   main()

, то вам, вероятно, не придется беспокоиться о таких вещах, как «предварительное объявление». Видите ли, интерпретатор загрузит все ваши функции, а затем запустит вашу функцию main (). Конечно, убедитесь, что у вас есть правильный импорт; -)

Если подумать, я никогда не слышал такой вещи, как "предварительное объявление" в python ... но опять же, я могу ошибаться ; -)

87
ответ дан 23 November 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: