- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想实现一个类似 dict 的数据结构,它具有以下属性:
from collections import UserDict
class TestDict(UserDict):
pass
test_dict = TestDict()
# Create empty dictionaries at 'level_1' and 'level_2' and insert 'Hello' at the 'level_3' key.
test_dict['level_1']['level_2']['level_3'] = 'Hello'
>>> test_dict
{
'level_1': {
'level_2': {
'level_3': 'Hello'
}
}
}
# However, this should not return an empty dictionary but raise a KeyError.
>>> test_dict['unknown_key']
KeyError: 'unknown_key'
据我所知,问题是 python 不知道 __getitem__
是在设置项目的上下文中调用的,即第一个示例,还是在获取和项目的上下文中,第二个例子。
我已经看到了Python `defaultdict`: Use default when setting, but not when getting ,但我不认为这个问题是重复的,或者它回答了我的问题。
如果您有任何想法,请告诉我。
提前致谢。
编辑:
可以使用以下方法实现类似的效果:
def set_nested_item(dict_in: Union[dict, TestDict], value, keys):
for i, key in enumerate(keys):
is_last = i == (len(keys) - 1)
if is_last:
dict_in[key] = value
else:
if key not in dict_in:
dict_in[key] = {}
else:
if not isinstance(dict_in[key], (dict, TestDict)):
dict_in[key] = {}
dict_in[key] = set_nested_item(dict_in[key], value, keys[(i + 1):])
return dict_in
class TestDict(UserDict):
def __init__(self):
super().__init__()
def __setitem__(self, key, value):
if isinstance(key, list):
self.update(set_nested_item(self, value, key))
else:
super().__setitem__(key, value)
test_dict[['level_1', 'level_2', 'level_3']] = 'Hello'
>>> test_dict
{
'level_1': {
'level_2': {
'level_3': 'Hello'
}
}
}
最佳答案
这是不可能的。
test_dict['level_1']['level_2']['level_3'] = 'Hello'
在语义上等同于:
temp1 = test_dict['level_1'] # Should this line fail?
temp1['level_2']['level_3'] = 'Hello'
但是...如果决定无论如何都要实现它,您可以检查 Python 堆栈以获取/解析调用代码行,然后根据调用代码行是否包含赋值来改变行为!不幸的是,有时调用代码在堆栈跟踪中不可用(例如,当以交互方式调用时),在这种情况下,您需要使用 Python 字节码。
import dis
import inspect
from collections import UserDict
def get_opcodes(code_object, lineno):
"""Utility function to extract Python VM opcodes for line of code"""
line_ops = []
instructions = dis.get_instructions(code_object).__iter__()
for instruction in instructions:
if instruction.starts_line == lineno:
# found start of our line
line_ops.append(instruction.opcode)
break
for instruction in instructions:
if not instruction.starts_line:
line_ops.append(instruction.opcode)
else:
# start of next line
break
return line_ops
class TestDict(UserDict):
def __getitem__(self, key):
try:
return super().__getitem__(key)
except KeyError:
# inspect the stack to get calling line of code
frame = inspect.stack()[1].frame
opcodes = get_opcodes(frame.f_code, frame.f_lineno)
# STORE_SUBSCR is Python opcode for TOS1[TOS] = TOS2
if dis.opmap['STORE_SUBSCR'] in opcodes:
# calling line of code contains a dict/array assignment
default = TestDict()
super().__setitem__(key, default)
return default
else:
raise
test_dict = TestDict()
test_dict['level_1']['level_2']['level_3'] = 'Hello'
print(test_dict)
# {'level_1': {'level_2': {'level_3': 'Hello'}}}
test_dict['unknown_key']
# KeyError: 'unknown_key'
以上只是部分解决方案。如果在同一行上有其他字典/数组分配,它仍然可以被愚弄,例如other['key'] = test_dict['unknown_key']
。更完整的解决方案需要实际解析代码行以找出变量在赋值中出现的位置。
关于python - 在设置项目时充当 defaultdict 但在获取项目时不充当 defaultdict 的嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61118676/
如果没有子类化dict,一个类需要被认为是一个映射,以便它可以通过**传递给一个方法。 from abc import ABCMeta class uobj: __metaclass__ =
所以。我正在研究 PHP/MySQLi atm,为此我正在做一个电影数据库。我是 PHP 新手,我已经在网上搜索了 3 天有同样问题的人,但我没有找到任何东西。 我的问题是我需要一个编辑按钮,这样就可
我的代码是这样的: void some_func(void *source) { ... double *casted = reinterpret_cast(source);
我无法准确理解 array_splice 和 array_slice 的作用。据我所知,array_splice 应该在取出某些元素后返回一个数组,而 array_slice 应该检索数组的一部分。
我从数据库中检索了 54 项: items = Item.where(condition) items.count == 54 and then: items.each {|i| i.tag_list
我在 HTML 表单中有一个简单的图像,充当按钮。当单击普通按钮时,我会使用 onClick 属性对其进行操作,但是对于我的图像,当您单击它们时,onClick 会起作用,但图像也会提交表单,而实际上
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我正在使用一个名为 acts_as_votable 的 gem让我的模型可以投票。 目前一切正常。 但是每次有人为帖子投票时,页面都必须刷新。如何在不刷新页面的情况下进行投票。我可以添加一个简单的 j
我的 bootstrap 3 页面在第一次页面加载时仅显示一个 div。当我单击“打开下一个 block ”按钮时,会显示另一个 div,如果我单击第二个 div,则会显示第三个 div。这样我总共可
我主要对 感兴趣 a11y 方面 因此,您可能知道,有时您可能希望有一个用作 anchor 的按钮。 这些是解决这个问题的 4 种方法(我能想到): 1. anchor 元素内的按钮 Button 2
在我的 main.storyboard 中,我有一个 UIImage View ,它只是一个通用的 Facebook 登录按钮。但是,我很困惑,因为使用这些通用步骤 override func vie
问题 我有这个 bash 脚本: ACTIVE_DB=$(grep -P "^[ \t]*db.active" config.properties | cut -d= -f2 | tr -s " ")
我目前正在使用 inline-block instead of floats 构建一个使用漂亮网格结构的站点. 简而言之,我的网格是这样工作的(JSFiddle) : HTML
我最近开始使用 Bootstrap 并且没有遇到任何问题,除了我遇到的这个问题。我已经使用它建立了自己的个人网站,并将其设计为响应式的,到目前为止,它在所有方面看起来都很棒。 但我遇到的问题是,从 9
这是一个不幸的问题,但我看不到任何其他解决方法。 基本上,我使用 Kendo UI 面板栏来创建可扩展列表。问题是,当您使用 作为子列表,面板栏功能不起作用。 fiddle 示例: http://js
我正在尝试获取一个 16 位长的数字 0x1122334455667788 并将其移位以说明小端编号。 使用下面的示例代码从内存单元中加载数字 void endianCompute(memory_t
我目前正在使用一堆输入文本字段,我想将其更改为 DIV,但我的大部分 JS 函数都使用 document.getElementById("inputField1").value每当输入字段的值设置如下
是否可以使用 HTML5 (或任何其他元素)就像一个 iframe,但内容是从它的子元素而不是从 URL 加载的?例如,如果您要在主文档中进行此设置: 以及foo.html的内容是: 主文档会显
我正在尝试使用 EJB session Bean 的示例。我想看看他们的区别。我的基本项目图如下; http://img109.imageshack.us/img109/8262/85220418.p
我们公司有一个项目,现在使用 nginx 作为反向代理来提供静态内容和支持 comet 连接。我们使用长轮询连接来摆脱不断的刷新请求,让用户立即获得更新。 现在,我知道已经为 Node.js 编写了很
我是一名优秀的程序员,十分优秀!