파이썬 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)
또는 더 좋은 방법은 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 collections
def 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)
Node
수업을 그대로 좋아합니다 . 명명 된 튜플로 변환하는 이유는 무엇입니까?