一个实用程序,它可以方便地在python字典中使用点表示法

waterbear的Python项目详细描述


waterbear\_is\_a\_bear

水熊是熊

waterbear,一个基类,它使python字典可以用点表示法、递归地和默认值进行访问

现在介绍最小的熊!waterbear

waterbear使使用带有点符号的python字典变得很容易!

Waterbear:bear做什么?

Waterbear就像defaultdict+SimpleNameSpace+ namedtuples

Waterbear的用法与namedtuplesrecordtypes相似, 但它不是元组或数组类型,而是字典。区别在于 可以通过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

有两个类,BearDefaultBear。违约 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!"

还可以与varsstrprint(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

在条件逻辑中使用时,BearDefaultBear行为 就像一本普通的字典!

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!tardigrade

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

推荐PyPI第三方库


热门话题
java在Hibernate中从两个具有不同功能的表(postgreSQL)映射一个实体   java jfreechart需要自定义Y轴,以便打印   Java:从外部获取类。罐子   java如何获取Appium服务器日志   具有完全相同内容的java重写函数会导致错误   java消息的类路径是什么。属性(如果在依赖项jar中)   循环/相等的java问题==   java如何使用ionic cordova angularjs将所选图像发送到spring controller以保存到服务器?   库中的java语言环境数据   java从JSON webservice检索安卓中的字节[]   调试如何从Java中的类调试方法?   java将日期字符串切割成变量   无法使用java附加到文件?