Question créer un dictionnaire à partir d'une liste de variables


Je cherche un moyen de créer un dictionnaire sans écrire la clé explicitement Je veux créer une fonction qui obtient des variables numériques et créer un dictionnaire où le nom des variables sont les clés et leur valeur la valeur de la variable

Au lieu d'écrire la fonction suivante:

def foo():
    first_name = "daniel"
    second_name = "daniel"
    id = 1
    return {'first_name':first_name, 'second_name':second_name}

Je veux obtenir le même résultat avec la fonction:

create_dict_from_variables(first_name, second_name)

y a-t-il un moyen de le faire?


13
2018-02-29 07:40


origine


Réponses:


Tu ne peux pas faire ça.

Votre fonction pourrait être définie comme suit:

def create_dict_from_variables(first_name, second_name):
    return something_from(first_name, second_name)

et vous pouvez appeler cette fonction:

create_dict_from_variables('abcd', 'efgh')

Ces deux arguments 'abcd' et 'efgh' ne sont pas des variables nommées.


2
2018-02-29 07:46



Vous ne pouvez pas le faire sans écrire au moins les noms de variables, mais un raccourci peut être écrit comme ceci:

>>> foo = 1
>>> bar = 2
>>> d = dict(((k, eval(k)) for k in ('foo', 'bar')))
>>> d
{'foo': 1, 'bar': 2}

ou en tant que fonction:

def createDict(*args):
     return dict(((k, eval(k)) for k in args))

>>> createDict('foo','bar')
{'foo': 1, 'bar': 2}

vous pouvez aussi utiliser globals() au lieu de eval():

>>> dict(((k, globals()[k]) for k in ('foo', 'bar')))

11
2018-02-29 08:50



Vous pouvez utiliser locals, mais je le déconseillerais. Faites-le explicitement.

>>> import this
[...]
Explicit is better than implicit.
[...]

Votre code sera généralement meilleur, plus prévisible, moins susceptible de se casser et plus compréhensible si vous le faites explicitement.


4
2018-02-29 07:47



Non, il n'y en a pas, car les fonctions Python n'obtiennent pas d'informations sur les variables utilisées pour appel la fonction. Imaginez aussi faire quelque chose comme ceci:

create_dict_from_variables(first_name[:-3] + "moo", last_name[::2])

La fonction n'aura aucun moyen de connaître les expressions utilisées pour créer les paramètres.


1
2018-02-29 07:47



En principe, cela est possible en faisant passer des noms de variables pour fonctionner create_dict et ensuite atteindre un cadre de pile d'appelant de l'intérieur create_dict fonction utilisant le module inspect.


0
2017-12-21 02:36