Python 3.7
使用 默认 参数。
>>> from collections import namedtuple>>> fields = ('val', 'left', 'right')>>> Node = namedtuple('Node', fields, defaults=(None,) * len(fields))>>> Node()Node(val=None, left=None, right=None)或者更好的是,使用新的dataclasses库,它比namedtuple好得多。
>>> from dataclasses import dataclass>>> from typing import Any>>> @dataclass... class Node:... val: Any = None... left: 'Node' = None... right: 'Node' = None>>> Node()Node(val=None, left=None, right=None)
在Python 3.7之前
设置
Node.__new__.__defaults__为默认值。
>>> from collections import namedtuple>>> Node = namedtuple('Node', 'val left right')>>> Node.__new__.__defaults__ = (None,) * len(Node._fields)>>> Node()Node(val=None, left=None, right=None)在Python 2.6之前
设置
Node.__new__.func_defaults为默认值。
>>> from collections import namedtuple>>> Node = namedtuple('Node', 'val left right')>>> Node.__new__.func_defaults = (None,) * len(Node._fields)>>> Node()Node(val=None, left=None, right=None)订购
在所有版本的Python中,如果您设置的默认值少于namedtuple中的默认值,则默认值将应用于最右边的参数。这使您可以将某些参数保留为必需参数。
>>> Node.__new__.__defaults__ = (1,2)>>> Node()Traceback (most recent call last): ...TypeError: __new__() missing 1 required positional argument: 'val'>>> Node(3)Node(val=3, left=1, right=2)
适用于Python 2.6到3.6的包装器
这是给您的包装器,甚至可以让您(可选)将默认值设置为以外的其他值
None。这不支持必需的参数。
import collectionsdef namedtuple_with_defaults(typename, field_names, default_values=()): T = collections.namedtuple(typename, field_names) T.__new__.__defaults__ = (None,) * len(T._fields) if isinstance(default_values, collections.Mapping): prototype = T(**default_values) else: prototype = T(*default_values) T.__new__.__defaults__ = tuple(prototype) return T
例:
>>> Node = namedtuple_with_defaults('Node', 'val left right')>>> Node()Node(val=None, left=None, right=None)>>> Node = namedtuple_with_defaults('Node', 'val left right', [1, 2, 3])>>> Node()Node(val=1, left=2, right=3)>>> Node = namedtuple_with_defaults('Node', 'val left right', {'right':7})>>> Node()Node(val=None, left=None, right=7)>>> Node(4)Node(val=4, left=None, right=7)


