首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的动态自引用字典

Python中的动态自引用字典
EN

Stack Overflow用户
提问于 2013-11-22 22:16:34
回答 1查看 1K关注 0票数 0

我曾见过some SO questions制作引用同一词典其他部分的字典,但它们似乎都是为了在第一次创建字典时进行静态返回。有办法做到这一点并保持活力吗?

就像这样:

代码语言:javascript
复制
# 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

因此:

代码语言:javascript
复制
barn['pig'] = 3
print barn

将打印如下:

代码语言:javascript
复制
{'pig':3, 'chicken':6, 'cow':0}

我尝试使用lambda函数或类,但我尝试将其作为一个庞大的字典进行筛选,以便在multiprocessing模块中的进程之间传递,而该模块似乎不喜欢lambdaclass结构。

编辑:

我尝试使用在多处理脚本中给出的答案,似乎它是不可挑选的:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-22 23:48:25

也许是这样的?用Python2.7进行测试。

代码语言:javascript
复制
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

运行它应该会产生如下内容:

代码语言:javascript
复制
{'cows': 1, 'chicken': 4, 'pigs': 2}
{'cows': 1, 'chicken': 6, 'pigs': 3}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20155526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档