【发布时间】:2012-07-06 06:04:31
【问题描述】:
我正在尝试将一个较长的空心“数据”类转换为一个命名元组。我的班级目前看起来像这样:
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),但这不是我喜欢的。
那么是否有一个好技巧可以使我的重写成功而不会增加大量代码复杂性(元编程),还是我应该吞下药丸并继续“搜索和替换”? :)
【问题讨论】:
-
为什么要进行这种转换?我喜欢你原来的
Node课程。为什么要转换为命名元组? -
我想进行这种转换,因为当前的
Node和其他类是具有一堆不同字段的简单数据持有者值对象(Node只是其中之一)。这些类声明只不过是线路噪音恕我直言,因此想要将它们修剪掉。为什么要维护不需要的东西? :) -
你的类中根本没有任何方法函数吗?例如,您没有一个
.debug_print()方法来遍历树并打印它吗? -
当然可以,但这是针对
BinaryTree类的。Node和其他数据持有者不需要这样的特殊方法,尤其是考虑到命名元组具有不错的__str__和__repr__表示。 :) -
好吧,看起来有道理。而且我认为 Ignacio Vazquez-Abrams 已经给了你答案:使用一个为你的节点执行默认值的函数。
标签: python default-value namedtuple optional-arguments