namedtuple и значения по умолчанию для необязательных аргументов ключевого слова

Я пытаюсь преобразовать длинный пустой класс «данных» в именованный кортеж. Мой класс сейчас выглядит так:

class Node(object):
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

После конвертации в namedtupleвыглядит как:

from collections import namedtuple
Node = namedtuple('Node', 'val left right')

Но есть проблема. Мой первоначальный класс позволил мне передать только значение и позаботился о значении по умолчанию, используя значения по умолчанию для именованных/ключевых аргументов. Что-то вроде:

class BinaryTree(object):
    def __init__(self, val):
        self.root = Node(val)

Но это не работает в случае с моим реорганизованным именованным кортежем, поскольку он ожидает, что я передам все поля. Я, конечно, могу заменить вхождения Node(val)на Node(val, None, None), но мне это не нравится.

Итак, существует ли хороший трюк, который может сделать мою пере -запись успешной, не добавляя много сложности кода (метапрограммирования ), или я должен просто проглотить пилюлю и продолжить «поиск и замену»?:)

263
задан Raymond Hettinger 15 January 2018 в 22:16
поделиться