如何在Python中对数据类型建模(几乎在那里命名为tuple?)

如何在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. 事实证明,我并不是一个人,事实上,我问的问题基本上和我一样 然而,这里的新问题是,这个问题的答案没有提到命名双倍(可能是在它之前?),

我有函数式编程的背景,我想建模 “datatype”-Rust/ML/Haskell/Typed Racket/etc中显示的样式数据

例如:

## 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