一个Python DICT子类,它试图像JavaScript对象一样运行,因此可以使用点标记(D.Foo)访问对象的成员。

mydict的Python项目详细描述


mydict

一个pythondict子类,它试图像javascript对象一样工作,因此可以使用dot表示法来访问对象的成员。如果成员还不存在,那么当你给它分配一个值时,它就被创建了。括号符号(d['foo'])也被接受。

安装

$ pip install mydict

示例

让我们试一试

d=MyDict()d.foo='bar'print(d.foo)# ==> 'bar'

如果您试图获得一个不存在的成员的值,那么返回{{EM1}$$NONO值< /p>

d=MyDict()ifd.fooisNone:print('"foo" does not exist yet!')

如果该值是“complex”(一个dict或另一个mydict实例),那么它也是recursive转换为mydict对象的,因此您可以以相同的方式访问它

d=MyDict()d.foo={'bar':'baz','lst':[{'a':123}]}print(d.foo.bar)# ==> 'baz'print(d.foo.lst[0].a)# ==> 123

如您所料,列表中的值是用括号符号(d[0])访问的:

d=MyDict()d.foo=[1,2,3]print(d.foo[2])# ==> 3

我们可以从任何复杂度

的^ {EM1}$DICT实例化它。
d=MyDict({'foo':'bar','baz':[1,2,{'foo':'bar','baz':'Hello, world!'}]})print(d.foo)# ==> 'bar'print(d.baz[0])# ==> 1print(d.baz[2].foo)# ==> 'bar'

使用构造函数中的关键字

d=MyDict(a=1,b=2.2,c=[1,2,3],d=[{'x':1,'y':[100,200,300]}])# ...d.a==1d.b==2.2d.c[0]==1d.d[0].x==1d.d[0].y[1]==200

或两者皆有

d=MyDict({'foo':'bar'},baz=123)# ...d.foo=='bar'd.baz==123

请注意,关键字初始化优先于dict(构造函数constructor的第一个参数)

d=MyDict({'foo':'bar'},foo='BAR')# ...d.foo=='BAR'

也可以使用pathgetbrackets符号访问成员:

d=MyDict(foo={'bar':'baz'})# ...d['foo.bar']=='baz'd.get('foo.bar')=='baz'

但是,当树中存在那些具有点“eEM>”的键{EM1}$时,它们使用相应的键

访问。
d=MyDict({'foo.bar':'baz'})# ...# 'foo.bar' is not interpreted as a path because the key existsd['foo.bar']='baz'

但是有一个特殊的情况,如果存在一个^ {EM1}$$EDD> EME,并且与现有的^ {EM1}$PATH < EEM >匹配,那么这就不能正常工作,或者根据所使用的访问方法以不同的方式工作,正确的

d=MyDict({'foo':{'bar':'baz'},'foo.bar':'BAZ'})# ...d['foo.bar']='BAZ'# the "dotted field" ('foo.bar') has precedence over the pathd.foo.bar='baz'# it's not possible to detect a "dotted key" using "dot notation"

就我个人而言,我不认为这是一个大问题,因为我通常避免在键中使用点,如前一种情况

转换

您可以使用两种方法来检索转换为something:

mydict对象
到json

mydict对象作为json字符串(str)返回:

d=MyDict(foo="bar",arr=[1,2,{"three":3}])d.to_json()# '{"foo": "bar", "arr": [1, 2, {"three": 3}]}'
获取指令

在某些情况下,您需要plain oldpythondict表示mydict对象,尽管它是dict子类:

d=MyDict(foo="bar",arr=[{"one":1},{"two":2}])d.get_dict()# d_ = {'foo': 'bar', 'arr': [{'one': 1}, {'two': 2}]}

从json初始化

也可以从strbytes和类似文件的对象(使用.read()方法)加载json,使用static方法from嫒json

d=MyDict.from_json('{"foo": "bar"}')# d.foo == 'bar'd=MyDict.from_json(b'{"foo": "bar"}')# d.foo == 'bar'd=MyDict.from_json(open('/path/to/file.json','r'))# d = MyDict.from_json(open('/path/to/file.json', 'rb')) also work
fromioimportStringIO,BytesIOs=StringIO()s.write('{"foo": "bar"}')d=MyDict.from_json(s)# d.foo == 'bar'# ...b=StringIO()b.write(b'{"foo": "bar"}')d=MyDict.from_json(b)# d.foo == 'bar'

使用python 3.6成功通过了测试。使用python 2.7失败的“字节”测试,关于使用静态方法from_json()

$ pytest mydict -v

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

推荐PyPI第三方库


热门话题
datetime如何使用JodaTime在Java中设置时间属性   java固定算法的性能时间   java如何从JMenu中获取所选项以更改文本区域的文本颜色?   java配置单元UDF传递数组<string>作为参数   javaapachebeam和BigQuery   java与PrintWriter之间的差异。printf和PrintWriter。格式方法   继承如何处理按Java版本更改的导入,以及在多个版本上编译   xml java。lang.noClassDefFoundant生成错误   java如何使用包含映射的JSON发送POST请求?   java如何在任何应用程序的JAR文件中绑定MySql数据库?   Java脚本解释器   sslhttpclientjava。网SocketException:未实现未连接的socket   java如何为Android应用程序创建类似于Cron作业的东西   java JButton+radiobox+复选框   java内存管理将文件写入内存   java这是计算对象实例的有效方法吗?   用于死锁情况的java代码?   JavaSpring容器作为新实体插入,而不是存储在表中