Насколько я знаю, Обновление (наряду с Cookie Набора и возможно некоторыми другими собственными псевдозаголовками) были созданы Netscape в еще начальном этапе Интернета и был в основном (но не совсем) стандарт с тех пор. Поскольку примерно каждый поддержка браузера это, Обновление довольно безопасно использовать - и обычно.
я предполагаю, что это никогда не становилось частью официальных стандартов, потому что у них уже были условия для этого с кодами статусов.
Если вы не хотите определять функцию до , она используется, а определение ее после невозможно, как насчет определения ее в каком-то другом module?
Технически вы все равно сначала определяете его, но он чистый.
Вы можете создать рекурсию, как показано ниже:
def foo():
bar()
def bar():
foo()
Функции Python анонимны, как и значения, но они могут быть привязаны к имени.
В приведенном выше коде foo ()
не вызывает функцию с именем foo, она вызывает функцию, которая привязана к имени foo
в точке звонок сделан. Можно переопределить foo
где-нибудь еще, и тогда bar
вызовет новую функцию.
Ваша проблема не может быть решена, потому что это '
Вы не можете напрямую объявить функцию в Python. Если у вас есть логика, выполняющаяся до того, как вы определили функции, у вас, вероятно, все равно есть проблема. Поместите свое действие в if __name__ == '__main __'
в конце вашего скрипта (выполнив функцию, которую вы называете «main», если она нетривиальная), и ваш код будет более модульным, а вы ' Я смогу использовать его в качестве модуля, если вам когда-нибудь понадобится.
Также замените это понимание списка генератором выражения (например, print "\ n" .join (str (bla) for bla in sorted (mylist, cmp = cmp_configs))
)
Также не используйте cmp
, который устарел. Используйте клавишу
и укажите функцию «меньше».
Теперь подождите минуту. Когда ваш модуль достигает оператора печати в вашем примере, до того как было определено 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
.
«просто реорганизуйте мой код, чтобы у меня не было Эта проблема." Верный. Легко сделать. Всегда работает.
Вы всегда можете указать функцию до ссылки на нее.
«Однако бывают случаи, когда это, вероятно, неизбежно, например, при реализации некоторых форм рекурсии»
Не понимаю, как это даже отдаленно возможно. Приведите пример места, где вы не можете определить функцию до ее использования.
В 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.
Вы можете подумать, что тело функции - это просто еще один сценарий, который будет интерпретироваться после вызова функции. .
Нет, я не верю, что есть какой-либо способ объявить функцию в Python.
Представьте, что вы интерпретатор Python. Когда вы дойдете до строки
print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])
, вы либо знаете, что такое cmp_configs, либо нет. Чтобы продолжить, вам нужно знаю cmp_configs. Не имеет значения, есть ли рекурсия.
Если вызов 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 () в конце файла.
Что вы можете сделать, так это обернуть вызов в отдельную функцию.
Так что
foo()
def foo():
print "Hi!"
сломается, но
def bar():
foo()
def foo():
print "Hi!"
bar()
будет работать правильно.
Общие Правило в Python
- это не , что функция должна быть определена выше в коде (как в Pascal
), но что она должна быть определена перед ее использованием.
]Надеюсь, это поможет.
Если вы запускаете свой скрипт следующим образом:
if __name__=="__main__":
main()
, то вам, вероятно, не придется беспокоиться о таких вещах, как «предварительное объявление». Видите ли, интерпретатор загрузит все ваши функции, а затем запустит вашу функцию main (). Конечно, убедитесь, что у вас есть правильный импорт; -)
Если подумать, я никогда не слышал такой вещи, как "предварительное объявление" в python ... но опять же, я могу ошибаться ; -)