我正在尝试将一个长的空心“data”类转换为一个命名元组。我的班级目前看起来是这样的:
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')
但这里有个问题。我的原始类只允许传入一个值,并通过对named/keyword参数使用默认值来处理默认值。类似于:
class BinaryTree(object):
def __init__(self, val):
self.root = Node(val)
但这在我的重构命名元组中不起作用,因为它希望我传递所有字段。我当然可以把Node(val)
的出现替换成Node(val, None, None)
,但这不符合我的喜好。
那么,有没有一个好的技巧可以使我的重新编写成功,而不增加很多代码复杂性(元编程),或者我应该吞下药丸,继续“搜索和替换”?:)
Python3.7
使用默认值参数。
或者更好的方法是使用新的dataclasses库,它比namedtuple好得多。
Python3.7之前
将
Node.__new__.__defaults__
设置为默认值。Python2.6之前
将
Node.__new__.func_defaults
设置为默认值。命令
在所有版本的Python中,如果设置的默认值少于namedtuple中的值,则默认值将应用于最右边的参数。这允许您保留一些参数作为必需的参数。
Python2.6到3.6的包装器
这是一个包装器,它甚至允许您(可选)将默认值设置为
None
以外的值。这不支持必需的参数。示例:
我将namedtuple子类化并重写
__new__
方法:这保留了一个直观的类型层次结构,而工厂函数伪装成类的创建并没有这样做。
把它包装成一个函数。
相关问题 更多 >
编程相关推荐