相关疑难解决方法(0)

Python 中可变嵌套 Dict 的类型提示

由于我在 Python 中经常使用类型提示,因此我遇到了递归函数接受dict,str作为键和intdict作为值 ( Dict[str, Union[int, Dict[...]]) 的场景。此时的问题是可能的dict-value 也有str作为键和intdict作为值 ( Dict[str, Union[int, Dict[Dict[str, Union[int, Dict[...]]]])。

但是,我不知道传递的字典有什么深度。是否有可能通过类型提示来可视化这种重复模式?

python type-hinting python-typing

9
推荐指数
1
解决办法
4006
查看次数

你能在Python中定义递归类型提示吗?

我有一个 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 错误:

  • Pylance:“SelectedModelArgs”未定义
  • Mypy:现在无法解析“SelectedModelArgs”(可能是循环定义)

添加from __future__ import annotations到文件顶部并不能解决这些问题(就像在类定义中使用类名一样)。

我还尝试使用上面的代码示例,但将其嵌套"SelectedModelArgs"为字符串(如本答案中所述)。这可以解决 pylance 错误,但不能解决 mypy 错误。

python type-hinting python-3.x mypy python-typing

7
推荐指数
0
解决办法
94
查看次数

Python 中的递归数据类型

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

6
推荐指数
1
解决办法
2146
查看次数

递归类型注解

我正在尝试在适用的情况下向我的代码库引入静态类型注释。一种情况是在读取 JSON 时,结果对象将是一个以字符串为键的字典,具有以下类型之一的值:

  • bool
  • str
  • float
  • int
  • list
  • dict

然而listdict以上可以包含相同类型的字典,导致递归定义。这在 Python3 的类型结构中可以表示吗?

python typing python-3.x

3
推荐指数
2
解决办法
2381
查看次数