Pourquoi mon python fonction n'est pas définie, lorsqu'il existe dans le même fichier?
J'ai une fonction simple, que j'appellerai myFunction
. Elle prend deux paramètres, effectue quelques calculs sur eux, et retourne le résultat.
J'ai aussi une classe, MyClass
, qui a un constructeur qui a une tête comme ça:
__init__(self, bar, fun=myFunction):
Lorsque j'essaie d'exécuter quoi que ce soit dans cette classe, j'obtiens l'erreur suivante:
MyClass
def __init__(self, bar, fun=myFunction):
NameError: name 'myFunction' is not defined
Si je supprime cette classe, je peux utiliser myFun dans le Python, Shell, donc quel est le problème?
Veuillez cocher la bonne réponse, une solution. Nous choisissons les solutions de cette façon, non pas en disant qu'est-ce que la solution d'édition de la question.
OriginalL'auteur user1123936 | 2012-06-22
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas indiqué le code de sorte qu'il est difficile d'être sûr, mais je parie que
myFunction
est défini aprèsMyClass
. La valeur par défaut de l'expression est évaluée lorsque la__init__
méthode est définie, doncmyFunction
doit être défini à ce stade. Définir plus tard, il est trop tard.+1 Exactement. Afin d'obtenir le même effet, vous pouvez affecter
None
(ou n'importe quoi d'autre, mais il doit être défini) comme argument par défaut et ensuite les comparer et finalement affecter lamyFunction
fonction (cette cession sera évaluée lors de la méthode s'appelle en réalité).Python est l'un des plus simple (pas de sens il n'est pas puissant), la plus simple et la plus cohérente des langages de programmation que j'ai jamais connu. Probablement, il est en premier dans tous les ci-dessus, donc si vous pouviez parler de quelque chose de mieux, je vous serais très reconnaissant 🙂 Vraiment.
le problème est que Python essaie de lire le fichier vers le bas et l'analyse de tout ce sans de l'exécution jusqu'à ce qu'il ne peut pas plus (parce qu'il a besoin de faire une sorte de calcul pour analyser le reste). Je ne sais pas exactement le raisonnement derrière elle, mais cela fait sens intuitif comme un compromis: vous voulez être en mesure dynamique d'exécuter et de modifier votre code à la volée sans de la compilation, mais vous voulez aussi être en mesure d'optimiser où il est possible.
Python exécuter en tant qu'il lit.
def
est une instruction. Ledef my_function(): ...
bloc est exécuté quand Python la rencontre. Le résultat de cette exécution est de créer un objet représentant le code de la fonction, et de l'attribuer le nommy_function
.OriginalL'auteur Ned Batchelder
myFunction est une variable, pas une valeur, de sorte que vous ne pouvez pas l'utiliser en tant que paramètre par défaut.
Vous pourriez peut-être utiliser une fonction lambda comme paramètre par défaut au lieu du nom d'une fonction déclarée.
-1: bien sûr, vous êtes mal (ici: "_...est une variable, pas une valeur, de sorte que vous ne pouvez pas l'utiliser en tant que paramètre par défaut..."). Vous pouvez utiliser n'importe quoi comme argument par défaut, mais il (l'attribution de cette à l'argument par défaut) sera évaluée lors de la fonction (celle qui a mentionné l'argument par défaut) sera défini.
OriginalL'auteur nickgroenke