一个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第三方库


热门话题
如果在每次迭代后返回到原始状态,java是否可以安全地对正在迭代的数组进行变异?   linux java对'main'集合的未定义引用2:ld返回1退出状态   java如何在dynamodb上按多个字段进行排序(有解决方法吗)?   java错误处理servlet停止工作,我不知道原因:(   多线程如何在Java中暂停/恢复ExecutorService中的所有线程?   java为什么是我的jsoup。连接(url)无法使用某些url?   多线程理解Java多线程中的内存可见性   java sonar scanner可以在没有sonarqube服务器的情况下工作吗   如何从java中的页面获取不同的url?   java从文件中查找命令行中指定的单词   java类的“set”方法是否应该返回“void”或“boolean”?   如何使用java代码批量读取文件内容   二进制十进制(java.lang.NumberFormatException)   java如何在同一个句子中分别替换同一个单词但大小写不同?   java Spring `RestController`方法注释了`Transactional`,但“当前没有活动的事务”?   java OWL API:如何将域分配给OWLObjectProperty上的范围   java变量末尾的$有特殊意义吗?   java什么距离计算(经度、纬度)更精确?   卡片布局java GUI