由于我在 Python 中经常使用类型提示,因此我遇到了递归函数接受dict,str作为键和int或dict作为值 ( Dict[str, Union[int, Dict[...]]) 的场景。此时的问题是可能的dict-value 也有str作为键和int或dict作为值 ( Dict[str, Union[int, Dict[Dict[str, Union[int, Dict[...]]]])。
但是,我不知道传递的字典有什么深度。是否有可能通过类型提示来可视化这种重复模式?
我有一个 Python 类型的别名:
from typing import Tuple, Dict, Union
SelectedModelArgs = Dict[
str,
Union[
str,
float,
Tuple[float, float],
Dict[str, Union[str, float, Tuple[float, float]]],
],
]
Run Code Online (Sandbox Code Playgroud)
目前,这允许使用 str 到 str、float、float 元组或相同类型的嵌套字典的字典。有没有办法递归地定义它以允许任意嵌套?
例如
SelectedModelArgs = Dict[
str,
Union[
str,
float,
Tuple[float, float],
SelectedModelArgs,
],
]
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我收到 IDE 错误:
添加from __future__ import annotations到文件顶部并不能解决这些问题(就像在类定义中使用类名一样)。
我还尝试使用上面的代码示例,但将其嵌套"SelectedModelArgs"为字符串(如本答案中所述)。这可以解决 pylance 错误,但不能解决 mypy 错误。
Python 中最接近 Haskell 中的递归数据类型的是什么?(即在定义自身时使用类型自己的定义。)
编辑:
为了给出递归类型的更具体的定义,下面是 Haskell 中的二叉树:
data Tree a = Leaf a | Branch (Tree a) (Tree a)
Run Code Online (Sandbox Code Playgroud)
我的阅读方式如下:二叉树可以是叶子,也可以包含两个子树,这两个子树又是类型树本身。
有关Haskell中递归类型的更多信息,可以参考这里: https: //www.haskell.org/tutorial/goodies.html
我实际上想到的是将 Haskell 中的单词树定义转换为 Python。WordTree这是我的一个旧项目中的定义:
data WordTree = Word String | Subword String [WordTree] | Root [WordTree]
Run Code Online (Sandbox Code Playgroud)
AWordTree是一个 n 叉树结构,其中单词的公共前缀存储在双亲中,其余部分以排序的方式存储在树的叶子中。我相信这种类型定义有点类似于 Trie。然而,由于 Haskell 是一种函数式编程语言,它允许这种类型定义是递归的。Python 中(或者一般来说,在面向对象的编程中)对于这种类型的定义最接近的可能是什么?
python haskell type-hinting recursive-datastructures algebraic-data-types
我正在尝试在适用的情况下向我的代码库引入静态类型注释。一种情况是在读取 JSON 时,结果对象将是一个以字符串为键的字典,具有以下类型之一的值:
boolstrfloatintlistdict然而list,dict以上可以包含相同类型的字典,导致递归定义。这在 Python3 的类型结构中可以表示吗?