一个实用程序,它可以方便地在python字典中使用点表示法
waterbear的Python项目详细描述
水熊是熊
waterbear,一个基类,它使python字典可以用点表示法、递归地和默认值进行访问
现在介绍最小的熊!waterbear。
waterbear使使用带有点符号的python字典变得很容易!
Waterbear:bear做什么?
Waterbear就像defaultdict+SimpleNameSpace+ namedtuples。
Waterbear的用法与namedtuples或recordtypes相似, 但它不是元组或数组类型,而是字典。区别在于 可以通过key字符串来访问Waterbear属性 索引编号的。
Waterbear更类似于types.SimpleNamespace。但是,a 主要区别在于Waterbear启用:
- 在实例化期间通过default_factory设置默认值
- IDE的静态类型检查可以识别所有属性,因此 无需先使用即可自动完成。
- 递归工作
现在有了这三个,就没有其他的解决方案了 可用。像Munch这样的库不支持pythonic习惯用法。 在这种情况下,Waterbear允许您:
- 使用vars(bear)将bear对象转换为字典。
- 出于同样的目的使用dict(bear)。
- 使用print(bear)并获取字典字符串
- …pythondictobject中可用的所有方法
待办事项
- []修复类扩展使用模式
- [][删除线:将python2.7版本与python3合并]
- []删除:制作另一个名为tardigrade]的包
安装
pipinstallwaterbear
使用量
有关更多用法示例,请查看 test.py!
有两个类,Bear和DefaultBear。违约 bear允许您传入默认工厂作为第一个参数。 Bear允许您通过关键字参数__default
示例用法如下:
# Waterbear is a bear!fromwaterbearimportBearwaterbear=Bear(**{"key":100})assertwaterbear.key==100,'now waterbear.key is accessible!'assertwaterbear['key']==100,'item access syntax is also supported!'
类似于collection.defaultdict,有DefaultBear
bear=DefaultBear(None,a=10,b=100)assertvars(bear)=={'a':10,'b':100}assertbear.does_not_existisNone,"default value works"
类似于defaultbear的defaultdict
您可以使用DefaultBear类并将默认因子作为 第一个参数。
bear=DefaultBear(tuple,a=10,b=100)assertbear.does_not_existis(),"default factory also works!"
还可以与vars、str、print(repr)、dict等一起使用。
bear=Bear(a=10,b=100)assertstr(bear)=="{'a': 10, 'b': 100}"assertdir(bear)==['a','b']assertlist(iter(bear))==['a','b']assertdict(bear)=={'a':10,'b':100}
作为条件逻辑中的bool
在条件逻辑中使用时,Bear和DefaultBear行为 就像一本普通的字典!
deftest_dict_comparison():bear=Bear()assertnot{},'empty dictionary are treated as False value.'assertnotbear,'bear should be treated as False value too!'
与pickle一起使用
与默认工厂一起使用时,只有不可调用的才是可选取的。
deftest_pickle_setstate_getstate():# create a default bear with a default factorybear=DefaultBear('hey',a=10,b=100)pickle_string=pickle.dumps(bear)bear_reborn=pickle.loads(pickle_string)asserttype(bear_reborn)==DefaultBearassertvars(bear_reborn)=={'a':10,'b':100}bear=DefaultBear(lambda:'hey',a=10,b=100)function_fails=Falsetry:pickle.dumps(bear)exceptAttributeErrorase:function_fails=Trueassertfunction_fails
使用deepcopy
你可以做copy.deepcopy(bear)!
deftest_deepcopy():fromcopyimportdeepcopyoriginal=Bear(a=1,b={'ha':0})copy=deepcopy(original)copy.b.ha+=1assertcopy.b.ha==1assertoriginal.b.ha==0
作为基类
waterbear被完全重写,可以很好地与类扩展一起使用!
classExtendBear(Bear):@propertydef_hidden_stuff(self):return"._hidden_stuff"@propertydef__mangled_stuff(self):return".__mangled_stuff"@propertydef__dict__(self):return".__dict__"e=ExtendBear()asserte.__dict__==".__dict__"asserte._hidden_stuff=='._hidden_stuff'asserte._ExtendBear__mangled_stuff==".__mangled_stuff"
保序simplename空间
在tensorflow中,您经常需要 可用于sess.run([tensors...。我们正好建造了OrderedBear。 为此目的。它是^{tt13}的扩展$ 上课。
# First declare the typings (namespace) for your model class Reporting: loss=None entropy=None mean_kl=None # Now, you can instantiate this with new values ... inside model r = Reporting(entropy=-5, loss=1) # Notice that 1. we are putting values in out-of-order, and 2. We are missing `mean_kl` in our construction. tems = r.items() assert items[0] == ('loss', 1), 'order follows class declaration.' assert items[1] == ('entropy', -5), 'entropy goes after loss even though this is the second atrribute' assert items[2] == ('mean_kl', None), 'undefined falls back to the default' values = r.values() assert values[0] == 1, 'order follows class declaration.' assert values[1] == -5, 'entropy goes after loss even though this is the second atrribute' assert values[2] == None, 'undefined falls back to the default' keys = r.keys() assert keys[0] == 'loss', 'order follows class declaration.' assert keys[1] == 'entropy', 'entropy goes after loss even though this is the second atrribute' assert keys[2] == 'mean_kl', 'undefined falls back to the default'
在测试中可以找到更多的用法!
有关更多用法示例,请查看 test.py。
test_dict={'a':0,'b':1}# Use spread operators to construct with a dictionary!test_args=Bear(**test_dict)asserttest_args.a==0asserttest_args.b==1# the value should now be accessible through the key name.test_args.haha=0asserttest_args.haha==0# You can also use a nested dictionary.test_args.haha={'a':1}asserttest_args.haha!={'a':1}assertvars(test_args.haha)=={'a':1}asserttest_args.haha.a==1asserttest_args.__dict__['haha']['a']==1assertvars(test_args)['haha']['a']==1assertstr(test_args)=="{'a': 0, 'b': 1, 'haha': {'a': 1}}", \ 'test_args should be this value "{\'a\': 0, \'b\': 1, \'haha\': {\'a\': 1}}"'# To set recursion to false, use this `__recursive` parameter.test_args=Bear(__recursive=False,**test_dict)asserttest_args.__is_recursive==Falseasserttest_args.a==0asserttest_args.b==1test_args.haha={'a':1}asserttest_args.haha['a']==1asserttest_args.haha=={'a':1}# Some other usage patternstest_args=Bear(**test_dict,**{'ha':'ha','no':'no'})asserttest_args.ha=='ha','key ha should be ha'
发展
gitclonehttps://github.com/episodeyang/waterbear.gitcdwaterbearmakedev
这个make dev命令应该构建控制盘并将其安装到 当前的python环境。看看 https://github.com/episodeyang/waterbear/blob/master/Makefile了解详细信息。
若要发布,请先更新版本号,然后执行:
make publish
*图片版权归bbc所有waterbear: The Smallest Bear!