Ich versuche, eine längliche hohle "Daten" -Klasse in ein benanntes Tupel umzuwandeln. Meine Klasse sieht derzeit so aus:
class Node(object):
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
Nach der Konvertierung namedtuple
sieht es so aus:
from collections import namedtuple
Node = namedtuple('Node', 'val left right')
Aber hier gibt es ein Problem. In meiner ursprünglichen Klasse konnte ich nur einen Wert übergeben und mich um den Standard kümmern, indem ich Standardwerte für die Argumente named / keyword verwendete. Etwas wie:
class BinaryTree(object):
def __init__(self, val):
self.root = Node(val)
Dies funktioniert jedoch nicht bei meinem überarbeiteten benannten Tupel, da erwartet wird, dass ich alle Felder übergebe. Ich kann natürlich die Vorkommen von Node(val)
to ersetzen , Node(val, None, None)
aber es gefällt mir nicht.
Gibt es also einen guten Trick, der mein Umschreiben erfolgreich macht, ohne viel Codekomplexität hinzuzufügen (Metaprogrammierung), oder sollte ich einfach die Pille schlucken und mit dem "Suchen und Ersetzen" fortfahren? :) :)
Node
und andere Klassen einfache Datenhalter-Wertobjekte mit einer Reihe verschiedener Felder sind ( Node
ist nur eines davon). Diese Klassendeklarationen sind meiner Meinung nach nicht viel mehr als Leitungsrauschen und wollten sie daher reduzieren. Warum etwas pflegen, was nicht benötigt wird? :)
.debug_print()
Methode, die über den Baum läuft und ihn druckt?
BinaryTree
Klasse. Node
und andere Dateninhaber benötigen keine solchen speziellen Methoden, insbesondere da benannte Tupel eine anständige __str__
und __repr__
repräsentative Form haben . :)
Node
Klasse so wie sie ist. Warum in benanntes Tupel konvertieren?