2012-02-29 19 views
10

Estoy buscando una manera de crear diccionario sin escribir la clave explícitamente Quiero crear una función que obtenga variables numéricas, y crear diccionario donde las variables son las claves y su valor es el valor de la variablecrear diccionario a partir de la lista de variables

en lugar de escribir la siguiente función:

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

quiero conseguir el mismo resultado con la función:

create_dict_from_variables(first_name, second_name) 

hay de todos modos para hacerlo?

Respuesta

2

No puede hacer esto.

Su función se podría definir como:

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

y se puede llamar a esta función:

create_dict_from_variables('abcd', 'efgh') 

Estos dos argumentos 'abcd''efgh' y no se nombran variables.

4

Puede usar locals, pero yo recomendaría que no lo haga. Hágalo explícitamente.

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

Su código será generalmente mejor, más predecible, menos propenso a la rotura y más comprensible si se hace de forma explícita.

+1

Pensé en los lugareños, pero no quiero pasar muchas variables variables – user1087310

+0

@ user1087310: bueno, has pensado en la única posibilidad que existe. Ahora que ha descartado eso, sepa que no hay forma de hacerlo; ¡hazlo explícitamente y disfruta! –

+0

Ha pasado mucho tiempo desde que abordé algo que no puedo hacer en Python. Estoy escribiendo algunas funciones que necesitan devolver la mayoría de los parámetros para otras funciones.el diccionario devuelto es casi idéntico a los nombres de las variables, por lo que tengo muchas posibilidades de hacer un error al escribir la clave explícitamente. Pero mi abuelo me dijo una vez que la vida no es fácil :) – user1087310

1

No, no lo hay, porque las funciones de Python no obtienen información sobre las variables utilizadas para llamar a la función. Además, imaginar haciendo algo como esto:

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

La función no tendrá forma de saber las expresiones utilizadas para crear los parámetros.

10

No puede hacerlo sin tener que escribir al menos los nombres de las variables, sino una forma abreviada se puede escribir así:

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

o como una función:

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

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

también se puede utilizar globals() en lugar de eval():

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

En principio esto es pos ible pasando nombres de variables a la función create_dict y luego llegando a un marco de pila de llamadas desde la función create_dict utilizando el módulo inspect.

Cuestiones relacionadas