Python dict使用点符号和链接
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python dict使用点符号和链接,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2356字,纯文字阅读大概需要4分钟。
内容图文
![Python dict使用点符号和链接](/upload/InfoBanner/zyjiaocheng/721/bebc9d6d491c496d83c2e666d5340cd9.jpg)
理想情况下,我希望实现的是一个扩展(或非常类似)Python中的dict并具有附加功能的类:
> Dot-Notation能够设置和获取值
>像dict这样的键值功能(即setitem,getitem)
>可以连接带点的操作
目标是如果我有类似于example = DotDict()的东西,我可以对它执行以下操作example.configuration.first =’first’并且它将在示例下实例化相应的DotDict实例,其中非常痛苦的警告是,如果操作是不分配它应该只是像dict那样引发KeyError
这是我天真地组装的东西
class DotDict(dict):
def __getattr__(self, key):
""" Make attempts to lookup by nonexistent attributes also attempt key lookups. """
import traceback
import re
s= ''.join(traceback.format_stack(sys._getframe(1),1))
if re.match(r' File.*\n.*[a-zA-Z]+\w*\.[a-zA-Z]+[a-zA-Z0-9_. ]*\s*=\s*[a-zA-Z0-9_.\'"]+',s):
self[key] = DotDict()
return self[key]
return self[key]
def __setattr__(self, key, value):
if isinstance(value,dict):
self[key] = DotDict(value)
self[key] = value
它的作用除了一些常见的边缘情况外,我必须说我绝对讨厌这种方法,必须有更好的方法.查看堆栈并在最后一行上运行正则表达式不是实现此目的的好方法.
问题的核心是Python从左到右解释代码行,所以当它到达像abc = 3这样的语句时,它的第一个操作是getattr(a,b)而不是setattr,所以我无法轻易确定堆栈操作中的最后一个操作是赋值.
我想知道的是,是否有一种很好的方法来确定操作堆栈中的最后一个操作,或者至少是否是一个setattr.
编辑:
这是我提出的解决方案,这要归功于user1320237的推荐.
class DotDict(dict):
def __getattr__(self, key):
""" Make attempts to lookup by nonexistent attributes also attempt key lookups. """
if self.has_key(key):
return self[key]
import sys
import dis
frame = sys._getframe(1)
if '\x00%c' % dis.opmap['STORE_ATTR'] in frame.f_code.co_code:
self[key] = DotDict()
return self[key]
raise AttributeError('Problem here')
def __setattr__(self, key, value):
if isinstance(value,dict):
self[key] = DotDict(value)
self[key] = value
在实际实现中还有一点点但是它做了很棒的工作.它的工作方式是它检查堆栈中的最后一帧并检查字节代码的STORE_ATTR操作,这意味着正在执行的操作是a.b.this.doesnt.exist.yet =’something’说服.如果可以在CPython之外的其他解释器上完成,我会很好奇.
解决方法:
您可能需要覆盖那些边缘情况的getattribute,然后使用
object.__getattribute__
看看模块dis.
但是你写的比拆解更好.
>>> import dis
>>> def g():
a.b.c = 4
>>> dis.dis(g)
2 0 LOAD_CONST 1 (4)
3 LOAD_GLOBAL 0 (a)
6 LOAD_ATTR 1 (b)
9 STORE_ATTR 2 (c)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
内容总结
以上是互联网集市为您收集整理的Python dict使用点符号和链接全部内容,希望文章能够帮你解决Python dict使用点符号和链接所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。