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
模塊中的進程和該模塊似乎不喜歡lambda
或class
結構。
編輯:
我試圖用一個多腳本給出了答案,看來,它不是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
爲什麼這是一本字典,而不是一類? – Falmarri
我需要它是一種數據類型,可以在管道或管理器中輕鬆地在進程之間傳遞。我實際上是以OO的方式完成了我的整個程序,然後在它完成之後發現它的速度非常慢並且有限,所以我現在正在嘗試對它進行多處理。 我的想法是製作一個大詞典(詞典等),它把對象作爲鍵和它們的屬性作爲值,我可以改變它們,然後在流程中的函數中使用它們。 如果這是一個糟糕的主意,我很樂意聽到更好的設計,但對我而言這是最有意義的。 – chase
這裏真的不清楚你想要什麼。編寫'barn = {'pig':0,'cow':0}是微不足道的;穀倉['雞'] = 2 *穀倉['豬']'但大概這不是你想要的(無論如何不涉及參考 - 最後一個條目只是零)... –