Python 隐藏字典键
我有一个字典,它是从一个我无权访问代码的函数传递给我的。在这本词典中有一个键叫做Python 隐藏字典键,python,dictionary,Python,Dictionary,我有一个字典,它是从一个我无权访问代码的函数传递给我的。在这本词典中有一个键叫做“time”。我可以打印d['time']并打印我期望的值。但是,当我遍历字典时,会跳过该键。另外d.keys()不包括它。如果重要的话,其他键都是数字键 我该如何重现这个?您如何在不知道名称的情况下查看隐藏的密钥?这可以撤销吗 打印类型(d)返回由于任何类都可以重新定义\uuu getitem\uuuuuuuuuuu(对于dict子类,\uuuu missing\uuuuuuuu)。如果文档没有涵盖它,除了检查源代
“time”
。我可以打印d['time']
并打印我期望的值。但是,当我遍历字典时,会跳过该键。另外d.keys()
不包括它。如果重要的话,其他键都是数字键
我该如何重现这个?您如何在不知道名称的情况下查看隐藏的密钥?这可以撤销吗
打印类型(d)
返回
由于任何类都可以重新定义\uuu getitem\uuuuuuuuuuu
(对于dict
子类,\uuuu missing\uuuuuuuu
)。如果文档没有涵盖它,除了检查源代码之外,没有明确定义的方法来发现任何给定对象中可用的“隐藏键”。首先:不要假设它是字典,测试它,bult in function type(d)将告诉您d对象的类/类型。注意:不要使用类型来检查类型,因为要使用isinstance函数
要回答您的问题:是的,可以这样做,请参见以下内容:
此外,如果您正在调查dict,请不要忘记dict.items,它类似于键,但会打印出键和值
最后,不要使用打印调试,请使用或
这个简单的组合
import pdb; pdb.set_trace()
将在您需要的地方为您提供交互式控制台
所以我想说这很有可能。它只是关于getitem。。。不,它很可能是不可逆转的 正如其他人所说,这可以通过多种方式实现。也许最简单的是
defaultdict
,尽管这会在查找时添加键:
import time
from collections import defaultdict
with_hidden_key = defaultdict(time.time, {
"foo": 123,
"bar": 1024,
"bash": "YOLO",
})
具体情况取决于实际发生的情况。简单复制:
class fake_dict(dict):
def __getitem__(self, item):
if item == 'time':
return 'x'
d = fake_dict({'a': 'b', 'c': 'd'})
assert isinstance(d, dict)
assert 'time' not in d.keys()
print d # {'a': 'b', 'c': 'd'}
assert d['time'] == 'x'
你能粘贴代码片段吗?它可能是一个类的实例,类似于一个字典?当你
print d
时会发生什么?@wwii当我print d
时,我得到了与d.keys()相同的集合。你找到函数返回的对象类型了吗?我周一回去工作时会这样做,谢谢你的提示。另一个答案在某种程度上取决于这一结果。我尽量避免像“不要做某事”这样的绝对说法。战略布局的打印语句/功能非常有用。此回复非常有用。我不知道我可以得到这种调试。不幸的是,我没有访问底层代码的权限,所以现在我只能使用他们给我的东西。听起来默认字典类型没有隐藏键的空间,因此如果没有代码访问权限,我无法真正了解发生了什么。我突然想到,如果代码是用Python编写的(但您没有源代码,只有编译的.pyc
文件),您可能可以使用反汇编程序在其中进行深入研究(dis
module)查找一些资料。
class fake_dict(dict):
def __getitem__(self, item):
if item == 'time':
return 'x'
d = fake_dict({'a': 'b', 'c': 'd'})
assert isinstance(d, dict)
assert 'time' not in d.keys()
print d # {'a': 'b', 'c': 'd'}
assert d['time'] == 'x'