用字符串作为链键实现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中的else if语句返回语法错误   http如何解析从表单到REST Java/Webservice的post请求   java如何在SpringBoot中为RestTemplate编写JUnit测试   java动态检查实例是否实现接口   java在Android中使用ArrayAdaptor时,数据不会显示   根据前序遍历返回二进制树的java方法   Arquillian测试类中的java注入始终为空   用户界面Java Swing自定义控件   java使用CompletableFutures递归地从同一函数的多个调用构建列表   在Java中将“.00”添加到整数BigDecimal   卡夫卡java未知\u主题\u或\u部分错误间歇性   java为什么我的getString()方法总是返回null?   java renameTo无法重命名文件   java为什么我可以强制转换对象?可以用其他对象来完成吗?   带有回写条件的java多根记录器   关于stackoverflow错误的java帮助?   java Websphere消息队列多线程   Java图形窗口/画布未垂直显示完整的六边形网格   java Sakai未在Tomcat服务器中启动