在命名元组中设置可选变量

时间:2015-07-17 21:08:31

标签: python

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

因此,我的用例是一个具有可选字段的数据结构..但是如果需要,应该能够修改它。

5 个答案:

答案 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;