from collections import namedtuple
FooT = namedtuple('Foo', 'foo bar')
def Foo(foo=None, bar=None):
return FooT(foo,bar)
foo = Foo()
foo.foo = 29
throws attribute error
因此,我的用例是一个具有可选字段的数据结构..但是如果需要,应该能够修改它。
答案 0 :(得分:5)
defaultdict
应该适合您的需要。它的工作原理是为它提供一个构造函数,每次访问未设置的元素时它都会调用它。这是一个演示:
>>> from collections import defaultdict
>>> d = defaultdict(lambda:None)
>>> d['foo'] = 10
>>> d['bar'] = 5
>>> print d['baz']
None
>>> d['baz'] = 15
>>> print d['baz']
15
答案 1 :(得分:3)
根据定义,元组是不可变的。 Namedtuples也遵循这种模式。
在python3中,似乎有一个可以使用的SimpleNamespace [1]。如果你想简单地使用读/写数据结构,你可以创建一个类并对其成员设置约束。
[1] - Why Python does not support record type i.e. mutable namedtuple
答案 2 :(得分:2)
一个像元组一样的名字元素是不可修改的。由于问题是关于namedtuple,在某些情况下,您可能会发现使用_replace
方法创建新对象(或有时甚至更可取)。当然,对同一对象的其他引用将保持不变。
from collections import namedtuple
FooT = namedtuple('Foo', 'foo bar')
def Foo(foo=None, bar=None):
return FooT(foo,bar)
foo = Foo()
foo = foo._replace(foo=29)
答案 3 :(得分:1)
对于上述答案略有不同,为什么不扩展tutorial中的建议,并且有一个类对任何未定义的属性都返回None?例如:
class Foo(object):
def __getattr__(self, name):
return None
这与defaultdict非常相似,但可以通过直接属性访问,就像命名元组一样。
答案 4 :(得分:0)
为什么不只使用一个班级?
margin-left:4px;