40Fermer42
RiRiLe 19/08/2023 à 23:02
Folco (./10) :
Là je viens de lire un truc qui me trouducute quand même un peu :
L'exécution d'une fonction introduit une nouvelle table de symboles utilisée par les variables locales de la fonction. Plus précisément, toutes les affectations de variables effectuées au sein d'une fonction stockent la valeur dans la table de symboles locale ; en revanche, les références de variables sont recherchées dans la table de symboles locale, puis dans la table de symboles locale des fonctions englobantes, puis dans la table de symboles globale et finalement dans la table de noms des primitives
Ca veut dire... qu'une variable X dans une fonction masquera la variable X de la fonction appelante, mais que la variable X de la fonction appelante sera visible si elle n'est pas redéfinie dans la fonction appelée ??
C'est moi ou c'est casse-cou, error-prone, et contre toute notion de privatisation et de protection de données en général (encapsulation par exemple) ?

Sauce : https://docs.python.org/fr/3.8/tutorial/controlflow.html#defining-functions

edit -> ah ben non :
>>> def func1():
...  x = 1
...  func2()
...
>>> def func2() :
...  print(x + 1)
...
>>> func1()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in func1
  File "<stdin>", line 2, in func2
NameError: name 'x' is not defined
Bon ben je raconte que de la mayrde et j'ai rien compris à leur formulation cry Mais au moins, ça me parait plus naturel grin

Bon pour du déterrage, c'est du déterrage, mais je pense que l'on a vu pire trioui. Pour mon premier post depuis ... 10 ans ? c'est une belle performance tricol !

Et puis j'ai vu qu'en décembre 2022 Folco posait encore des questions Python, donc je me dis que ça peut servir.
Je suis en train de lire "Python Basics" de "Real Python", et je viens de tomber sur l'exact même chose, qui confirme ce qui te trouducute Folco : Python va bien chercher d'abord dans le scope local, puis Enclosing, puis Global et enfin Built-in (le fameux LEGB).
Si dans ton test ça merde, c'est que x est défini dans le scope local de func1() et ne sera jamais visible dans le scope local de func2().

J'avoue que c'est plutôt casse gueule... Je pense que c'est pour cela que Flanker recommande de ne pas utiliser de variables dans le scope global (en plus de simplifier la création des tests unitaires ?).
Et comme tu le signales dans le post suivant, cela me fait bizarre de ne pas déclarer le type de mes variables. En VBA je le fais systématiquement, ça limite beaucoup les erreurs bêtes... Ici aussi Flanker semble indiquer que Pycharm (et d'autres) peuvent aider avec des truc du type ma_func(mon_arg : str) -> str: Je ne connaissais pas, il va falloir que je creuse ce point.