2012-02-29 101 views
10

我正在寻找一种方法来创建字典,而无需明确编写密钥 我想创建获取数字变量的函数,并创建字典,其中变量名称是键和它们的值是变量值从变量列表中创建字典

而不是写以下功能:

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

我想与功能相同的结果:

create_dict_from_variables(first_name, second_name) 

有没有这样做?

回答

2

你不能这样做。

你的函数可以定义为:

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

,你可以调用这个函数:

create_dict_from_variables('abcd', 'efgh') 

这两个参数'abcd''efgh'未命名的变量。

4

您可以使用locals,但我会建议反对它。明确地做。

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

您的代码通常会更好,更可预见的,不容易破碎,如果你这样做更明确的理解。

+1

关于本地人的想法,但我不想传递许多临时变量 – user1087310 2012-02-29 08:00:52

+0

@ user1087310:那么,你已经想过有唯一的可能性。既然你已经抛弃了这一点,就知道没有办法做到这一点。明确地做,并享受! – 2012-02-29 08:06:39

+0

自从我解决了一些我不能在python中完成的工作已经很长时间了。我正在写几个函数,需要返回其他函数的大部分参数。返回的字典与变量名称几乎完全相同,所以当我明确写入密钥时,我有很高的机会发生错字。但是我的祖父曾经告诉过我,生活并不容易:) – user1087310 2012-02-29 08:17:27

1

不,没有,因为Python函数没有获得有关变量的信息,用于调用函数。此外,想象做这样的事情:

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

函数将无法知道用于创建参数的表达式。

10

你不能这样做没有至少变量名称书写,但速记可以这样写:

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

或作为一个函数:

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

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

你也可以使用globals()代替eval()

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

原则上这是POSS通过将变量名称传递到功能create_dict然后从create_dict功能使用模块inspect到达呼叫者堆栈帧。