【问题标题】:How do I use Type Hinting to show a List<Foo>如何使用类型提示来显示 List<Foo>
【发布时间】:2019-09-17 16:09:14
【问题描述】:

我有一堆执行功能的类,但是通过类型提示,我现在想让它显示该类的一个实例,或者该类的实例列表。

class Foo:
  pass
class Bar:
  pass
class Win:
  pass

然后我开始看到 Typings,并且正在做以下事情:

get_all_foos() -> list:
  return []

这是有道理的,但我希望它更冗长。类似于:

get_all_foos() -> list<Foo>:
  return []

我在网上查找,似乎我可能需要使用 LIST 类型,而不是基本 list

from typing import List
get_all_foo() -> List[Foo]:
  pass

虽然我认为我没有遇到任何错误,但我想确保这是按照 Python 标准做事的正确方法,或者是否适合这样做:

get_all_foo() -> list[Foo]:
  pass

【问题讨论】:

  • 参见 mypy 的 the official documentation
  • 查看它时,没有明确的 Iterables 文档,尽管当 ctrl+f 时,我确实得到了对:List[str] 的引用,这让我认为 List[Foo] 是可以接受的,尽管返回类型 ISNT 一个 List,而是一个 list 作为 Typing 不能被实例化。所以 List 不是数据结构,而是纯粹的 Typing。
  • Tuples 有一个例子,Lists 也有同样的概念

标签: python-3.x


【解决方案1】:

根据对 python 文档的研究,答案如下。

列表是可以实现的。它是一个数据结构。

List 是一种类型,用于类型提示。它不是数据结构。

对于熟悉其他类型语言的人来说,我的错误是我将 List 误认为是具有类似实现列表的替代数据结构。

也就是说,你可以拥有一个函数:

get_all() -> List[Foo]: pass

但由于上述原因,返回类型不能是列表。

它仍然是一个列表,因为那是实际的数据结构。它纯粹是为了装饰目的。我在概念上遇到了问题,因为我试图通过使事物成为示例显示的列表来强制键入,但由于它不可实例化,所以这一切都有意义。

因此你很容易拥有

def get_all() -> List[Foo]: return [] 

返回一个列表。我在想提示和返回应该是相同的类型。

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 2015-11-19
    • 2020-11-03
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2023-02-16
    • 2017-05-30
    • 2022-10-14
    相关资源
    最近更新 更多