如何在Python中对数据类型建模(几乎在那里命名为tuple?)
我有函数式编程的背景,我想建模 “datatype”-Rust/ML/Haskell/Typed Racket/etc中显示的样式数据 例如:如何在Python中对数据类型建模(几乎在那里命名为tuple?),python,functional-programming,Python,Functional Programming,我有函数式编程的背景,我想建模 “datatype”-Rust/ML/Haskell/Typed Racket/etc中显示的样式数据 例如: ## A binarytree is either ## - Leaf(val), representing a leaf, or ## - Node(left,right), representing a node. 事实证明,我并不是一个人,事实上,我问的问题基本上和我一样 然而,这里的新问题是,这个问题的答案没有提到命名双倍(可能是在它之前?),
## A binarytree is either
## - Leaf(val), representing a leaf, or
## - Node(left,right), representing a node.
事实证明,我并不是一个人,事实上,我问的问题基本上和我一样
然而,这里的新问题是,这个问题的答案没有提到命名双倍(可能是在它之前?),事实上命名双倍让我达到了95%。事实上,只有一个讨厌的黑客,围绕类名
具体来说,我可以写:
from collections import namedtuple;
Leaf = namedtuple('Leaf',['val'])
Node = namedtuple('Node',['left','right'])
。。。这使我能够以简单的方式构造值,例如:
my_tree = Node(Leaf(13),Node(Leaf('zoo'),Leaf(0.003)))
但是,如果我想知道给定的树是节点还是叶子,事情就会变得很糟糕:
if (type(my_tree).__name__ == 'Node'):
# do something with the node's elements
else:
# do something with the leaf's elements
具体来说,我认为类型
函数和名称
属性的使用非常糟糕
有没有更好的方法来做到这一点,或者我应该忘掉它,学会爱上\uu name\uuuu
属性?您可以使用:
但是,如果不使用\uuuuu name\uuuuu
,type也可以工作:
if type(my_tree) is Node:
两者都将返回True:
In [55]: type(my_tree) is Node
Out[55]: True
In [56]: isinstance(my_tree, Node)
Out[56]: True
如果对象参数是classinfo参数或其(直接、间接或虚拟)子类的实例,则isinstance
将返回true。可能应该使用类型(my_树)is Node
,而不是=
。
In [55]: type(my_tree) is Node
Out[55]: True
In [56]: isinstance(my_tree, Node)
Out[56]: True