Переадресация объявлений в Python для предотвращения ошибок имени для функций, определенных позже
В Python попытка вызвать функцию до ее определения может привести в NameError. Хотя реорганизация кода может показаться единственным решением, существуют альтернативные подходы.
Один из методов — предварительное объявление функции путем переноса ее вызова в отдельную функцию. Это позволяет вызывать функцию до того, как она будет определена, без возникновения ошибки NameError.
Например, следующий код завершится ошибкой:
print("\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)]))
Потому что функция cmp_configs еще не определена. Чтобы объявить его вперед, мы можем обернуть вызов:
def forward_declare_cmp_configs():
print("\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)]))
forward_declare_cmp_configs()
def cmp_configs():
...
Теперь функцию front_declare_cmp_configs() можно вызвать до определения cmp_configs(), и исходный код будет выполняться без ошибок.
Другой сценарий, в котором полезно предварительное объявление, находится в рекурсивные функции. Например, следующий код не сработает:
def spam():
if end_condition():
return end_result()
else:
return eggs()
def eggs():
if end_condition():
return end_result()
else:
return spam()
Чтобы заранее объявить рекурсивные вызовы, мы можем использовать подход вложенных функций:
def spam_outer():
def spam_inner():
if end_condition():
return end_result()
else:
return eggs()
def eggs():
if end_condition():
return end_result()
else:
return spam_inner()
return spam_inner()
spam_outer()()
Помните, что хотя предварительные объявления могут быть полезны, общее правило Python заключается в том, чтобы определять функцию перед ее первым использованием.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3