相关疑难解决方法(0)

像属性一样访问dict键?

我发现访问dict密钥更加方便,obj.foo而不是obj['foo'],所以我写了这个代码片段:

class AttributeDict(dict):
    def __getattr__(self, attr):
        return self[attr]
    def __setattr__(self, attr, value):
        self[attr] = value
Run Code Online (Sandbox Code Playgroud)

但是,我认为必须有一些原因,Python不提供开箱即用的功能.以这种方式访问​​dict密钥有什么警告和陷阱?

python syntax dictionary

273
推荐指数
16
解决办法
16万
查看次数

如何使用点"." 访问字典成员?

如何通过点"."访问Python字典成员?

例如,mydict['val']我不想写作,而是写作mydict.val.

此外,我想以这种方式访问​​嵌套的dicts.例如

mydict.mydict2.val 
Run Code Online (Sandbox Code Playgroud)

会参考

mydict = { 'mydict2': { 'val': ... } }
Run Code Online (Sandbox Code Playgroud)

python syntax dictionary nested

230
推荐指数
17
解决办法
13万
查看次数

Python:轻松访问深层嵌套的dict(get和set)

我正在构建一些Python代码来读取和操作深层嵌套的dicts(最终用于与JSON服务进行交互,但是出于其他目的它会很棒)我正在寻找一种方法来轻松读取/设置/更新内部值dict,不需要很多代码.

@see还有Python:通过属性递归访问dict以及索引访问? - Curt Hagenlocher的"DotDictify"解决方案非常有说服力.我也喜欢Ben Alman在http://benalman.com/projects/jquery-getobject-plugin/中为JavaScript提供的内容. 将两者结合起来会很棒.

在Curt Hagenlocher和Ben Alman的例子的基础上,拥有如下功能的Python会很棒:

>>> my_obj = DotDictify()
>>> my_obj.a.b.c = {'d':1, 'e':2}
>>> print my_obj
{'a': {'b': {'c': {'d': 1, 'e': 2}}}}
>>> print my_obj.a.b.c.d
1
>>> print my_obj.a.b.c.x
None
>>> print my_obj.a.b.c.d.x
None
>>> print my_obj.a.b.c.d.x.y.z
None
Run Code Online (Sandbox Code Playgroud)

知道这是否可行,如果可行,如何修改DotDictify解决方案?

或者,可以使get方法接受点符号(并添加补充集方法)但是对象符号确定更清晰.

>>> my_obj = DotDictify()
>>> my_obj.set('a.b.c', {'d':1, 'e':2})
>>> print my_obj
{'a': {'b': {'c': {'d': 1, 'e': 2}}}}
>>> print my_obj.get('a.b.c.d')
1
>>> print my_obj.get('a.b.c.x')
None
>>> print my_obj.get('a.b.c.d.x')
None …
Run Code Online (Sandbox Code Playgroud)

python

23
推荐指数
3
解决办法
2万
查看次数

在Python中轻松地从/向名称空间/词典转储变量

说我有在Python几个变量或对象a,b,c,...

如何轻松地这些变量转储到Python中的命名空间中并在以后恢复它们?(例如,以相同的方式argparse将各种变量包装到命名空间中).

以下是我希望如何在命名空间之间转储内容的两个示例:

将局部变量转储到命名空间中

function (bar):
   # We start with a, b and c
   a = 10
   b = 20
   c = "hello world"

   # We can dump anything we want into e, by just passing things as arguments:
   e = dump_into_namespace(a, b, c) 
   del a, b, c

   print (e.a + e.b) # Prints 30
   return e  # We can return e if we want. This is just …
Run Code Online (Sandbox Code Playgroud)

python syntax dictionary nested

10
推荐指数
2
解决办法
3447
查看次数

递归DotDict

我有一个实用程序类,使得Python字典在获取和设置属性方面的行为有点像JavaScript对象.

class DotDict(dict):
    """
    a dictionary that supports dot notation 
    as well as dictionary access notation 
    usage: d = DotDict() or d = DotDict({'val1':'first'})
    set attributes: d.val2 = 'second' or d['val2'] = 'second'
    get attributes: d.val2 or d['val2']
    """
    __getattr__ = dict.__getitem__
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__
Run Code Online (Sandbox Code Playgroud)

我想这样做它也将嵌套的字典转换成DotDict()实例.我希望能够做这样的事有__init____new__,但我还没有拿出任何的工作原理:

def __init__(self, dct):
    for key in dct.keys():
        if hasattr(dct[key], 'keys'):
            dct[key] = DotDict(dct[key])
Run Code Online (Sandbox Code Playgroud)

如何递归地将嵌套字典转换为DotDict()实例?

>>> dct = {'scalar_value':1, 'nested_dict':{'value':2}}
>>> dct = DotDict(dct)

>>> print dct
{'scalar_value': …
Run Code Online (Sandbox Code Playgroud)

python recursion dictionary

8
推荐指数
2
解决办法
4678
查看次数

这个Python模式有没有"陷阱"?

这是我正在考虑使用的模式:

class Dicty(dict): 
    def __init__(self): 
         self.__dict__ = self 

d = Dicty()
d.foo = 'bar' 
print d['foo']
>>> bar 
d['foo'] = 'baz'
print d.foo
>>> 'baz'
Run Code Online (Sandbox Code Playgroud)

一般来说,我更喜欢对象属性访问的语义而不是dict get/set访问,但是在某些情况下需要类似dict的访问(例如d['foo-bar'] = 'baz'),我宁愿不为这些情况使用特殊的getter setter方法,因此,dict和object同时具有共享属性的双重行为.

有上述模式的问题吗?

python coding-style

7
推荐指数
1
解决办法
3202
查看次数

标签 统计

python ×6

dictionary ×4

syntax ×3

nested ×2

coding-style ×1

recursion ×1