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.
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.
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'>
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()]
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.
↓ 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.
-Obtenir le nom de la variable en utilisant les locals () ・ Essayez de rendre le code plus facile à lire qu'à apprécier
Recommended Posts