【问题标题】:How can I assign a one from -> Human | Animal | Alien | None as the type with @dataclass in Python 3.7.x+如何从 -> Human | 分配一个动物 |外星人 | None 作为 Python 3.7.x+ 中 @dataclass 的类型
【发布时间】:2022-01-10 06:29:30
【问题描述】:

我的班级首字母如下

class Filter:
    ...
    # no need to assign types
    def get_type(self, type_name:str):
        if type_name == 'human':
            return Human()
        elif type_name == 'animal':
            return Animal()
        elif type_name == 'alien':
            return Alien()
        return None
    ...

和类似 (method) get_type: (data: dict) -> Human | Animal | Alien | None的vscode中指示的Filter.get_type()(vscode指示)

但是,我不确定如何将多个可选类型分配给我的变量,例如

import Filter

my_type: ??? = Filter.get_type()

通过将类型添加到my_type,自动补全将识别Human、Animal和Alien中的子类和变量(或绕过None)

如何将列表[Human, Animal, Alien] 中的多个类型分配给my_type?

【问题讨论】:

  • 嗯,Human | Animal | Alien | None?
  • @juanpa.arrivillaga 问题是针对 python 3.7.x,而不是 3.10
  • @bottlemind FWIW | 运算符的语法实际上可以使用 from __future__ import annotations 导入在 python 3.7 中工作
  • Human | Animal | Alien | None 是来自 vscode 的指示,我不确定它在 python 中是否是有效的语法;但我相信在 3.7.x ~ 3.10.x 之间添加多种类型选项的方式是一样的
  • @jbl 它在 3.10 中唯一有效的语法是在引入新的 Union 运算符的 PEP 时。在以前的python版本中,使用__future__导入有效地将注释包装在一个字符串中,因此例如3.10中的A | B在以前的版本中变为'A | B'——注意注释周围的单引号,表明它现在是一个字符串值.

标签: python types python-dataclasses


【解决方案1】:

已编辑。希望这次是你的意思

from typing import Union

class Filter:
    ...
    def get_type(self, type_name:str) -> Union[Human, Animal, Alien, None]:
        if type_name == 'human':
            return Human()
        elif type_name == 'animal':
            return Animal()
        elif type_name == 'alien':
            return Alien()
        return None
    ...

my_type: Union[Human, Animal, Alien, None] = Filter.get_type()

【讨论】:

    【解决方案2】:

    试试这个,它在 3.8 中使用 Literal 的概念来创建类型“集合”,并使用 Optional 来指示 None 何时可能是有效类型(参见 https://docs.python.org/3/library/typing.html):

    
    from typing import Literal, Optional
    
    Filter_Types: Literal[Human, Animal, Alien]
    
    class Filter:
    
        def get_type(self, type_name: str) -> Optional[Filter_Types]:
            ...
    

    【讨论】:

      猜你喜欢
      • 2019-06-06
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2023-03-06
      • 2012-10-19
      • 1970-01-01
      相关资源
      最近更新 更多