2013-11-22 32 views
0

我看過someSOquestions關於製作引用同一字典的其他部分的字典,但它們似乎都是在字典第一次創建時用於靜態返回。 有沒有辦法做到這一點,保持動態?Python中的動態自助參考字典

像這樣:

# Lets just say we have a barn with lots of animals 
# and the pigs always eat 2 chickens, so there has to always be 2 chickens per pig 
def make_barn(): 
    barn = {'pig': 0, 'cow': 0, 'chicken': 2*barn['pig']} 
    return barn 

這樣的:

barn['pig'] = 3 
print barn 

將打印:

{'pig':3, 'chicken':6, 'cow':0} 

我嘗試使用lambda函數或類,但我想泡菜這是一個巨大的字典,用於在multiprocessing模塊中的進程和該模塊似乎不喜歡lambdaclass結構。

編輯:

我試圖用一個多腳本給出了答案,看來,它不是picklable:

import multiprocessing as mp 
import random 
from UserDict import UserDict 

class Barn(UserDict): 
    '''Barn automatically sets correct values for chickens. 
    TBD: What to do if chickens get changed?''' 
    def __init__(self, *args, **kw): 
     UserDict.__init__(self, *args, **kw) 
     pigs = self.data.get('pigs', None) 
     if pigs is not None: 
      self.data['chicken'] = pigs * 2 

    def __setitem__(self, name, value): 
     if name == 'pigs': 
      self.data['chicken'] = value * 2 
     self.data[name] = value 

def count_animals(barn_record): 
    for animal in random.randrange(0,10,1): 
     barn_record['pigs'] = animal 

# We need this to 'if __name__ == '__main__':' business to avoid having too many farms created continuously 
# See here : https://stackoverflow.com/questions/1923706/multiprocessing-launching-too-many-instances-of-python-vm 
if __name__ == '__main__': 
    manager = mp.Manager() 
    barn_record = manager.dict({'pigs':3,'cows':2}) 
    farm = mp.Process(target = count_animals, args=(manager,)) 
    farm.start() 
    print barn_record 
+0

爲什麼這是一本字典,而不是一類? – Falmarri

+0

我需要它是一種數據類型,可以在管道或管理器中輕鬆地在進程之間傳遞。我實際上是以OO的方式完成了我的整個程序,然後在它完成之後發現它的速度非常慢並且有限,所以我現在正在嘗試對它進行多處理。 我的想法是製作一個大詞典(詞典等),它把對象作爲鍵和它們的屬性作爲值,我可以改變它們,然後在流程中的函數中使用它們。 如果這是一個糟糕的主意,我很樂意聽到更好的設計,但對我而言這是最有意義的。 – chase

+1

這裏真的不清楚你想要什麼。編寫'barn = {'pig':0,'cow':0}是微不足道的;穀倉['雞'] = 2 *穀倉['豬']'但大概這不是你想要的(無論如何不涉及參考 - 最後一個條目只是零)... –

回答

3

像這樣的事情吧?經過Python 2.7測試。

from UserDict import UserDict 

class Barn(UserDict): 
    '''Barn automatically sets correct values for chickens. 
    TBD: What to do if chickens get changed?''' 
    def __init__(self, *args, **kw): 
     UserDict.__init__(self, *args, **kw) 
     pigs = self.data.get('pigs', None) 
     if pigs is not None: 
      self.data['chicken'] = pigs * 2 

    def __setitem__(self, name, value): 
     if name == 'pigs': 
      self.data['chicken'] = value * 2 
     self.data[name] = value 

if __name__ == '__main__': 
    b = Barn(cows=1, pigs=2) 
    print b 
    b['pigs'] = 3 
    print b 

運行應該產生這樣的:

{'cows': 1, 'chicken': 4, 'pigs': 2} 
{'cows': 1, 'chicken': 6, 'pigs': 3} 
+0

哇!我沒有在文檔中看到過,這太棒了。希望它能很好地醃製,因爲它是一本字典,所以這很有意義。 – chase