2012-02-29 128 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到達呼叫者堆棧幀。