用字符串作为链键实现python中dict的链访问和引用访问
refdict的Python项目详细描述
refdict
用法
- 使用字符串作为链键来实现链访问(包括
dict
/list
/tuple
/str
)。 - 字符串可以作为另一项的引用执行。
安装
pip install refdict
功能
- 使用
refdict
就像使用dict
/list
/tuple
/str
。- 内置类型的方法:
refdict({}).keys()
或refdict([]).append(123)
。 - 迭代和包含检查:
for x in refdict([1, 2, 3])
。 - 切片和切片分配:
refdict([1, 2, 3])[:] => [1, 2, 3]
。 - 。
- 内置类型的方法:
- 使用字符串访问成员的链。
refdict({'1':{'1':{'1':{'1':'1'}}}})['1.1.1.1'] => 1
。
- 使用引用字符串引用其他项。
说明
使用引用前缀将字符串转换为另一项的引用。默认的引用前缀是@
。refdict的构造函数的参数refPrefix
可以更改引用前缀。
[]
运算符可用于链访问和引用访问。默认情况下,键的分隔符是.
,可以通过构造函数的参数separator
进行更改。
下面是一个示例:
data={'player':{'name':'DiscreteTom','items':['@potion.red'],'weapon':'@sword','attack':'@player.weapon.attack','me':'@player'},'potion':{'red':'restore your health by 20%',},'sword':{'attack':123},}rd=refdict(data)print(rd['player.items.0'])# => restore your health by 20%print(rd['player.attack'])# => 123print(rd['player.items.:'])# => ['@potion.red']print(rd.text('player.attack'))# => @player.weapon.attackprint('player.weapon'inrd)# => True
警告
递归引用如item: @item
将导致无限循环,包括间接引用。
data={'item':'@item',# => infinite loop!'wrapper':{'item':'@wrapper.item'# => infinite loop!},'a':'@b'# => infinite loop!'b':'@a'# => infinite loop!}
常见问题解答
- 为什么我不能使用
[1]
访问list
/tuple
/str
的第一项?- 当然,您应该使用
[0]
来访问第一个项,就像使用list
/tuple
/str
。这有点违反直觉,但很合理。
- 当然,您应该使用
- 为什么我在使用
rd['key1.key2']['key3.key4']
时得到KeyError
?- 第一个
[]
运算符将返回一个非refdict对象,因此不能在下面的[]
中使用链键。要获得子refdict,您应该使用()
运算符,这意味着您应该使用rd('key1.key2')['key3.key4']
。
- 第一个