一个实用程序,它可以方便地在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第三方库


热门话题
Maven中两个不同项目中的java循环依赖关系   java如何在没有php的情况下从MYSQL在线数据库Android中存储和检索图像   Java JTextField和非静态变量不能从静态上下文中引用   java在JavaFX中的后台交换多个fxml页面   java的历史介于1824年和1824年之间,if语句   按下后退按钮时,java是否返回到正确的活动?   java如何从LDAP对象及其属性中删除objectClass?   java如何颠倒字符数组从最后一个到第一个的顺序   java IBMiee双精度浮点字节转换   用于执行java桌面应用程序的部署可运行jar或bat文件   java Android日历视图设置颜色,没有不推荐的方法   java Lucene:多词短语的模糊搜索   编译java代码如何编译   陈旧元素Selenium和Java的JSON状态映射   java如何将我的cardview和滑块与滚动页面一起使用?   javajena&RDF如何获取具有特定属性的所有资源   java Android:在Pause()上保存对象,在Resume()上读取对象   java计划一个“命名”任务,这样我就可以重新安排它   java如何将字符串的长度打印到文件中   从ftp服务器下载java Android照片