一种getattr和setattr,用于嵌套对象、列表、dict及其任何组合,而不诉诸eval

magicattr的Python项目详细描述


magicattr

Build Statuscodecov

一个getattr和setattr,用于嵌套对象、列表, 字典,以及不使用eval的任何组合。

它与getattr和setattr的不同之处在于它保留了故障原因 而不是总是提出一个属性错误。

示例

假设我们有一个Person类,如下所示:

classPerson:settings={'autosave':True,'style':{'height':30,'width':200},'themes':['light','dark']}def__init__(self,name,age,friends):self.name=nameself.age=ageself.friends=friendsbob=Person(name="Bob",age=31,friends=[])jill=Person(name="Jill",age=29,friends=[bob])jack=Person(name="Jack",age=28,friends=[bob,jill])

有了magicattr,我们可以做到这一点

# Nothing newassertmagicattr.get(bob,'age')==31# Listsassertmagicattr.get(jill,'friends[0].name')=='Bob'assertmagicattr.get(jack,'friends[-1].age')==29# Dict lookupsassertmagicattr.get(jack,'settings["style"]["width"]')==200# Combination of lookupsassertmagicattr.get(jack,'settings["themes"][-2]')=='light'assertmagicattr.get(jack,'friends[-1].settings["themes"][1]')=='dark'# Setattrmagicattr.set(bob,'settings["style"]["width"]',400)assertmagicattr.get(bob,'settings["style"]["width"]')==400# Nested objectsmagicattr.set(bob,'friends',[jack,jill])assertmagicattr.get(jack,'friends[0].friends[0]')==jackmagicattr.set(jill,'friends[0].age',32)assertbob.age==32

你也可以这样删除。

# Deletionmagicattr.delete(jill,'friends[0]')assertlen(jill.friends)==0magicattr.delete(jill,'age')assertnothasattr(jill,'age')magicattr.delete(bob,'friends[0].age')assertnothasattr(jack,'age')

如果有人想惹你怎么办?

# Unsupportedwithpytest.raises(NotImplementedError)ase:magicattr.get(bob,'friends[0+1]')withpytest.raises(SyntaxError)ase:magicattr.get(bob,'friends[')withpytest.raises(ValueError)ase:magicattr.get(bob,'friends = [1,1]')# Nice try, function calls are not allowedwithpytest.raises(ValueError):magicattr.get(bob,'friends.pop(0)')

我错过什么了吗?告诉我!

它不能做什么?

切片、表达式、函数调用、从列表中追加/弹出、求值等…

它是如何工作的?

将attr字符串解析为ast节点并手动对其求值。

安装

pip install magicattr

许可证

麻省理工学院

希望有帮助,干杯!

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

推荐PyPI第三方库


热门话题
JavaGWT:何时使用Lazydemelement?   Java中跟踪消失线程的多线程处理   java Springboot未能配置数据源:“url”,但我没有使用数据库   java为按钮生成随机位置   math Java:包含二项式系数计算的表达式   java通过AsyncTask传递参数   从路径错误创建java文件   高流量网站的性能播放框架、Java、Apache、PostgreSQL、JPA和Hibernate   java将4D矢量转换为长矢量   arraylist Java循环在没有任何错误的情况下终止   java正在制作一个计算器应用程序,希望在第二个片段中更新历史,但无法完成   java将信息从IntentService发送到Activity   java如何在游戏中插入大量实体!工作   javascript如何在ScriptEngineforJava中从数学中获得准确的结果?