用字符串作为链键实现python中dict的链访问和引用访问

refdict的Python项目详细描述


refdict

PyPIGitHub

用法

  • 使用字符串作为链键来实现链访问(包括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']

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用Eclipse Helios for Web项目   java指定行。作为编译器设置的分隔符?   osm映射中带有osmdroid的java标记   java Android ClassNotFoundException在路径:DexPathList上未找到类   java从j2me调用GWT方法   更新到java 8后的aspectj问题   如何仅从根元素java,com提取文本内容。滴虫软件。是的。html   安卓公司。谷歌。火基。数据库DatabaseException:未能转换java类型的值。将字符串改为长字符串   从java中的方法返回arraylist变量   java如果将引用重新分配给同步块内的锁对象,会是什么?   java下载。使用spring mvc的资源文件中的xlsx文件   java Eclipse提供了什么工具来运行Eclipse中未包含的程序?   spring boot Java泛型如何读取传递给泛型方法的类型上的字段或调用方法   Javacard中的javaecdsa签名