免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4398 | 回复: 14
打印 上一主题 下一主题

非多线程环境下,如何锁住dict [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-17 12:29 |只看该作者 |倒序浏览
我想求教,在非多线程的环境下,如果我想锁住一个dict,比如不让增加新Key,或者不让改value。那我应该如何做到呢?

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
2 [报告]
发表于 2012-08-17 13:15 |只看该作者
看看 UserDict

论坛徽章:
0
3 [报告]
发表于 2012-08-17 14:30 |只看该作者
回复 2# cdtits

你的意思是不是这样:
  1. from UserDict import UserDict

  2. class myUserDict(UserDict):
  3.         def __init__(self,dict=None,lock=False,**kwarg):
  4.                 self.lock = lock
  5.                 UserDict.__init__(self,dict,**kwarg)
  6.         def lockit(self):
  7.                 self.lock = True
  8.         def unlockit(self):
  9.                 self.lock =False
  10.         def __setitem__(self,key,item):
  11.                 if self.lock:
  12.                         raise ValueError("The Dict is locked")
  13.                 else:
  14.                         return UserDict.__setitem__(self,key,item)
  15.         def __delitem__(self,key):
  16.                 if self.lock:
  17.                         raise ValueError("The Dict is locked")
  18.                 else:
  19.                         return UserDict.__delitem__(self,key)
  20.         def update(self,dict=None,**kwarg):
  21.                 if self.lock:
  22.                         raise ValueError("The Dict is locked")
  23.                 else:
  24.                         return UserDict.update(self,dict,**kwarg)
  25.         def setdefault(self,key,failobj=None):
  26.                 if self.lock:
  27.                         raise ValueError("The Dict is locked")
  28.                 else:
  29.                         return UserDict.setdefault(self,key,failobj)
  30.         def pop(self,key,*args):
  31.                 if self.lock:
  32.                         raise ValueError("The Dict is locked")
  33.                 else:
  34.                         return UserDict.pop(self,key,*args)
  35.         def popitem(self):
  36.                 if self.lock:
  37.                         raise ValueError("The Dict is locked")
  38.                 else:
  39.                         return UserDict.popitem(self)


复制代码
结果:
>>> from myUserDict import myUserDict
>>> a=myUserDict({1:1,2:2,3:3})
>>> a
{1: 1, 2: 2, 3: 3}
>>> a[4]=4
>>> a
{1: 1, 2: 2, 3: 3, 4: 4}
>>> a.lockit()
>>> a[5]=5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "myUserDict.py", line 13, in __setitem__
    raise ValueError("The Dict is locked")
ValueError: The Dict is locked
>>>   

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
4 [报告]
发表于 2012-08-17 14:56 |只看该作者
嗯,就是实现一个 warpper ...

论坛徽章:
0
5 [报告]
发表于 2012-08-17 15:11 |只看该作者
回复 4# cdtits


有更好的写法吗?总觉得有些臃肿。   

论坛徽章:
0
6 [报告]
发表于 2012-08-17 15:18 |只看该作者
回复 2# cdtits


    谢谢。在Perl Cookbook里,发现Hash::Util可以锁住Key和value以及整个hash。貌似原生的dict没有这个方法。所以就来问下。你Python不错啊

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
7 [报告]
发表于 2012-08-17 15:20 |只看该作者
回复 6# zhuyubei


    我 python 和 perl 都一般般

论坛徽章:
0
8 [报告]
发表于 2012-08-17 15:20 |只看该作者
回复 3# Hadron74


    这位朋友谢谢你的认真回复。按照你的实现,我觉得似乎可以不用UserDict也可以对原生的dict进行这样的继承。你觉得呢

论坛徽章:
0
9 [报告]
发表于 2012-08-17 15:25 |只看该作者
回复 8# zhuyubei

你说的是对的。不过还有更好的写法吗?感觉有些代码冗余在里面。
   

论坛徽章:
0
10 [报告]
发表于 2012-08-17 15:28 |只看该作者
回复 9# Hadron74


    包装类就是这么写得吧。要么用组合的方式使用dict作为其属性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP