6
votes

Redéfinir la fonction intégrée Python

Je travaille sur un programme Python et l'auteur a écrit une fonction qui ressemble à ce xxx

Ceci semble fonctionner, même si STR est une fonction intégrée et ne devrait pas être utilisé comme variable.

Qu'est-ce qui se passe réellement ici? Je suppose que STR ne sera plus utilisable comme une fonction, mais seulement dans la fonction de la fonction bla () qu'il est écrit. Est-ce exact? Cela ne redéfinisse pas STR globalement, non?


2 commentaires

Oui, str est seulement redéfini localement. Ce n'est probablement pas un problème énorme et je vois des exemples comme celui-ci avec des noms tels que max et str fréquemment. Si votre fonction n'a que quelques lignes de code, je ne perdrais pas de sommeil sur ceci.


Connexes: Stackoverflow.com/q/41029289/2988730 (définitivement pas une dupe)


3 Réponses :


-2
votes

Dans votre cas, STR est juste une variable et rien ne vous empêche d'utiliser habituel de str () à l'extérieur de cette fonction: xxx

EDIT:

Voici une simple démonstration: xxx


1 commentaires

"Rien ne vous empêche d'utiliser l'utilisation habituelle de Str () fonction" - ce n'est pas complet vrai. Comme Juanpa.arrivillaga a déjà mentionné str est redéfini localement. Vous ne pouvez donc pas utiliser str () dans la portée actuelle, mais que vous pourriez dans la portée globale.



6
votes

interne, la table variable locale de la fonction contiendra une entrée pour STR , qui sera locale à cette fonction. Vous pouvez toujours accéder à la classe intégrée dans la fonction en effectuant intégré.str dans py3 et __ intégré __. STR dans PY2. Tout code en dehors de la fonction ne verra aucune des variables locales de la fonction, la classe intégrée sera donc prudente à utiliser ailleurs.

Il y a un autre cas de cavité / coin ici, qui est décrit dans Cette question . L'entrée de la table locale est créée à la compilée, pas au moment de l'exécution, vous ne pouvez donc pas utiliser la définition globale de STR dans la fonction avant même d'affecter "asdf asdf asdf" Pour elle: xxx

échouera avec un Unboundlocaleurror .


2 commentaires

@Bradsolomon. Merci pour la prise


Construits.str. Nom 'Construits' n'est pas défini , apparemment, vous devez l'appeler à l'aide de __ cométine __. STR . J'utilise Python 3.7.5.



4
votes

Cela semble fonctionner, même si STR est une fonction intégrée et ne doit pas être utilisée comme une variable. P>

Oui, c'est vrai. Python ne vous empêche pas de vous tirer dessus dans le pied. C'est à vous de décider que le développeur de veiller à ne pas écraser les noms intégrés. P>

Qu'est-ce qui se passe réellement ici? Je suppose que STR ne sera plus utilisable en tant que fonction, mais seulement dans la portée de la fonction bla () code> il est écrit. Est-ce exact? Cela ne redéfinira pas str code> globalement, non? P> blockQuote>

Vous êtes partiellement correct ici aussi. Si la valeur de str code> est écrasée locale, alors seule la portée actuelle est affectée. La valeur globale de str code> reste inchangée. Cependant, si str code> est écrit dans la portée Global em>, alors il affecte tous les sous-échéances. La raison derrière ceci est la manière dont l'interpréteur de Python compile des valeurs au moment de l'exécution. Ce comportement peut être observé à l'aide d'un exemple simple: p>

>>> str = 0
>>> str
0
>>> del str
>>> str
<class 'str'>
>>> 


0 commentaires