Déclarations avant en Python pour empêcher les erreurs de nom pour les fonctions définies ultérieurement
En Python, tenter d'appeler une fonction avant qu'elle ne soit définie peut entraîner dans une NameError. Bien que la réorganisation du code puisse sembler être la seule solution, il existe des approches alternatives.
Une méthode consiste à déclarer une fonction en avant en encapsulant son appel dans une fonction distincte. Cela permet à la fonction d'être appelée avant qu'elle ne soit définie sans déclencher une NameError.
Par exemple, le code suivant échouera :
print("\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)]))
Parce que la fonction cmp_configs n'a pas encore été définie. Pour le déclarer en avant, nous pouvons envelopper l'invocation :
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():
...
Maintenant, la fonction forward_declare_cmp_configs() peut être appelée avant que cmp_configs() soit définie, et le code d'origine s'exécutera sans erreur.
Un autre scénario dans lequel la déclaration forward est utile est dans fonctions récursives. Par exemple, le code suivant échouerait :
def spam():
if end_condition():
return end_result()
else:
return eggs()
def eggs():
if end_condition():
return end_result()
else:
return spam()
Pour déclarer les appels récursifs, nous pouvons utiliser une approche de fonction imbriquée :
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()()
N'oubliez pas que même si les déclarations forward peuvent être utiles, la règle générale en Python est de définir une fonction avant sa première utilisation.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3