[Python] Récupère le nom de la variable avec str

Aperçu

Lors du développement avec Django, il y avait une partie que je voulais apprécier en utilisant des noms de variables. ~~ Je pense que ce n'est pas un bon code lorsque vous voulez utiliser des noms de variables en premier lieu ~~

Au début, j'ai écrit ceci désespérément, donc quand je l'ai recherché, il semble que cela puisse être réalisé avec la ** fonction intégrée locals () **.

def hoge(name, email, message):
    for variable_name, value in zip(("name", "email", "message"), (name, email, message)):
        print(f"{variable_name} -> {value}")

... mais c'est terrible.

Locaux de fonction intégrée ()

En regardant le document ... https://docs.python.org/ja/3/library/functions.html#locals

Met à jour et renvoie le dictionnaire représentant la table de symboles locale courante. Les variables libres sont renvoyées lorsque vous appelez locals () dans un bloc fonction, mais pas dans un bloc de classe. Notez qu'au niveau du module, locals () et globals () sont le même dictionnaire.

Remarque Ne modifiez pas le contenu de ce dictionnaire, les modifications n'affectent pas les valeurs des variables locales ou libres utilisées par l'interpréteur.

une. En bref, les variables de portée et les valeurs de l'emplacement appelé sont renvoyées sous forme de dictionnaires. Et cette valeur ne peut pas être modifiée. Il s'est avéré que le nom de la variable peut être obtenu par str en extrayant la clé de ce dict.

Regarde

Supposons que vous ayez un code comme celui-ci:

class Account(object):
    param = "param"
    print(locals())  #Ordre d'exécution 1

    def __init__(self, name, email):
        self.name = name
        self.email = email
        print(locals())  #Ordre d'exécution 2

    def some_function(self, param1, param2):
        self.param1 = param1
        self.param2 = param2
        print(locals())  #Ordre d'exécution 3


account = Account("ragnar", "[email protected]")
account.some_function(1, 2)
print(locals())        #Ordre d'exécution 4
print(type(locals()))  #Ordre d'exécution 5

Le résultat de l'exécution du code ci-dessus est le suivant. Vous pouvez obtenir la variable de la portée du lieu à imprimer. La valeur de retour est dict.

{'__module__': '__main__', '__qualname__': 'Account', 'param': 'param'}

{'self': <__main__.Account object at 0x1065e6990>, 'name': 'ragnar', 'email': '[email protected]'}

{'self': <__main__.Account object at 0x1065e6990>, 'param1': 1, 'param2': 2}

{'__name__': '__main__', '__doc__': None, '__package__': None, 
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10652a190>, 
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 
'__file__': '/Users/ragnar/workspace/class/locals.py', '__cached__': None, 
'Account': <class '__main__.Account'>, 'account': <__main__.Account object at 0x1065e6990>}

<class 'dict'>

Obtenir le nom de la variable

La valeur de retour est un dict ordinaire, vous pouvez donc l'obtenir en utilisant des clés ou des éléments. Le premier exemple peut être réécrit comme:

def hoge(name, email, message):
    for variable_name, value in locals().items():
        print(f"{variable_name} -> {value}")

Obtenir les noms de variables dans une liste est comme ceci.

def hoge(name, email, message):
    ls = [key for key in locals().keys()]

Et où puis-je l'utiliser?

Pour être honnête, je ne pense pas qu'il y ait beaucoup de situations où vous voulez le nom de variable str, mais j'en ai trouvé un.

* N'est-il pas possible de l'utiliser dans un constructeur qui a tendance à utiliser le même nom de variable que l'argument? *

↓ Code comme celui-ci

class Account(object):
    def __init__(self, name, email, sex, age):
        self.name = name
        self.email = email
        self.sex = sex
        self......

Si vous utilisez ceci comme nom de variable, cela ressemblera à ceci.

class Account(object):
    def __init__(self, name, email, sex, age):
        for variable_name, value in locals().items():
            if not variable_name == 'self':
                self.__dict__[variable_name] = value

...... Je ne l'utilise pas à moins que l'argument soit incroyablement long.

Conclusion

-Obtenir le nom de la variable en utilisant les locals () ・ Essayez de rendre le code plus facile à lire qu'à apprécier

Recommended Posts

[Python] Récupère le nom de la variable avec str
Comment obtenir le nom de la variable lui-même en python
Obtenez la météo avec les requêtes Python
Obtenez la météo avec les requêtes Python 2
Obtenez le nom d'hôte en Python
Obtenez date avec python
[Python] Récupérez les fichiers dans le dossier avec Python
Obtenez le nom de la branche git et le nom de la balise avec python
Obtenez le code du pays avec python
Obtenez le nom de la variable sous forme de chaîne de caractères.
[Python] Obtenez les nombres dans l'image graphique avec OCR
Obtenez des données Youtube avec python
Obtenez des résultats au format dict avec Python psycopg2
[Python] Récupérez le mois précédent
Obtenir l'ID de thread avec python
Commencez avec Python! ~ ② Grammaire ~
Appelez l'API avec python3.
Obtenez l'état de fonctionnement de JR West avec Python
Obtenez des stocks avec Python
Obtenir le répertoire personnel avec python
Obtenir un événement de clavier avec python
Obtenez des informations sur l'alambic avec Python
[Python3] Mettre en forme la chaîne de caractères en utilisant le nom de la variable comme clé
Lorsque le nom de la variable entre en conflit avec la commande Devaga dans pdb
Connaissances minimales pour démarrer avec le module de journalisation Python
[Python] Récupère le répertoire d'exécution du script avec un chemin absolu
Comment entrer dans l'environnement de développement Python avec Vagrant
Commerce du système à partir de Python3: obtenez le dernier code de programme
Essayez de déchiffrer les caractères déformés dans le nom du fichier joint avec Python
[Introduction à Python] Comment obtenir des données avec la fonction listdir
Obtenez le nom d'hôte du PC hôte avec Docker sous Linux
Récupérez la source de la page à charger indéfiniment avec python.
Extraire le fichier xz avec python
Commencez avec Python! ~ ① Construction de l'environnement ~
Lien pour commencer avec python
Obtenez des avis avec l'API googlemap de python
Obtenez le chemin du bureau en Python
Obtenez une capture d'écran Web avec python
[Python] Obtenez des données économiques avec DataReader
Obtenez le chemin du script en Python
Comment obtenir la version Python
Trouvez la distance d'édition (distance de Levenshtein) avec python
Comment démarrer avec Python
Accédez à l'API Etherpad-lite avec Python
Installer le plug-in Python avec Netbeans 8.0.2
[Petite histoire] Obtenez l'horodatage avec Python
J'ai aimé le tweet avec python. ..
Obtenez les tendances Qiita avec le scraping Python
Obtenez le chemin du bureau en Python
Maîtriser le type avec Python [compatible Python 3.9]
Remarque Python: obtenez le mois en cours
Démarrez avec Python avec Blender
Obtenez des informations météorologiques avec Python et le grattage
Comment est le progrès? Continuons le boom ?? en Python
Le moyen le plus rapide d'obtenir régulièrement des images de caméra avec opencv de python
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
Obtenez des informations sur la propriété en grattant avec python
[Python] Définissez la plage du graphique avec matplotlib
[Note] Obtenir des données de PostgreSQL avec Python
Vérifier l'existence du fichier avec python
[Python] Arrondissez avec juste l'opérateur