当前位置: 首页 > 知识库问答 >
问题:

python - Python 中 `int* | str*` 和 `int | str` 有什么区别?

司徒兴德
2024-08-13
from typing import Generic, TypeVar, cast
from dataclasses import dataclass

@dataclass
class SteamSave: 
    prop: int


@dataclass
class XboxSave:
    prop: str


T = TypeVar('T', SteamSave, XboxSave)

class Editor(Generic[T]):
    def __init__(self, save: T):
        self.save_data = save

    def print_prop(self):
        print(self.save_data.prop)


class Editor2():
    def __init__(self, save: SteamSave | XboxSave):
        self.save_data = save

    def print_prop(self):
        print(self.save_data.prop)

print(Editor)
print(Editor[SteamSave])
print(Editor[XboxSave])

VSCode 对两个类 self.save_data.prop 的类型推断结果:
图片.png
图片.png

int* | str*int | str 有什么区别,多出来的星号是什么意思?

共有1个答案

徐博雅
2024-08-13

在 Python 的类型注解(type hints)中,并没有直接使用 int* | str* 这样的语法来表示类型。这看起来像是一个误解或者是对其他编程语言(如 C 或 C++)中指针概念的混淆。在 Python 中,int | str 是使用 Python 3.10 及以后版本引入的联合类型(Union Type)的正确方式,它表示一个变量可以是 int 类型或 str 类型中的任何一个。

在你的例子中,Editor 类使用了泛型(Generics)来接受一个类型参数 T,这个 T 被限制为 SteamSaveXboxSave。因此,当你实例化 Editor[SteamSave]Editor[XboxSave] 时,self.save_data 相应地会被推断为 SteamSaveXboxSave 类型的实例,而 self.save_data.prop 则分别被推断为 intstr 类型。

另一方面,Editor2 类直接在其构造函数中使用了 SteamSave | XboxSave 作为 save 参数的类型注解。这同样表示 save 参数可以是 SteamSaveXboxSave 类型的实例。在这种情况下,VSCode 或其他类型检查工具应该能够推断出 self.save_data.prop 的类型也是 intstr(尽管这种推断可能依赖于工具对类属性的理解程度)。

关于 int* | str* 中的星号(*),在 Python 的类型注解中,星号没有直接的含义。如果你在 Python 代码中看到这样的表示,它很可能是个错误,或者是对其他语言特性的误解。在 C 或 C++ 中,星号用于表示指针类型,但在 Python 中,我们不需要(也不能)在类型注解中显式地表示引用或指针。Python 中的变量名总是指向对象的引用,但这种引用是隐式的,不需要在类型注解中显式声明。

总结来说,int | str 是 Python 中表示联合类型的正确方式,而 int* | str* 并不是 Python 中的有效语法,星号(*)在这里没有特殊意义。

 类似资料:
  • 本文向大家介绍python中int与str互转方法,包括了python中int与str互转方法的使用技巧和注意事项,需要的朋友参考一下 最近学习python中的数据类型时,难免联想到java中的基本型数据类型与引用型数据类型。于是对python中的int与str做了简单赋值输出,出现了意料之外的事情。 使用int(object)后,a与b的地址是一样的。 补充:python在给变量赋值时默认格式为

  • 我的程序需要一个函数,该函数从csv文件(“all.csv”)读取数据,并在特定日期提取与某个州有关的所有数据(提取其中包含“state name”和“date”的每一行),然后将提取的数据写入另一个名为:state.csv的csv文件 当数据被写入时,每个州在特定日期的病例数和死亡数被统计和合计。然后,该函数以元组形式返回总病例和死亡数(病例,死亡) 例如州=‘加利福尼亚’日期=‘2020-03

  • 问题内容: 如果我尝试执行以下操作: …以及Python 2.x中的类似错误: 我该如何解决这个问题? 问题答案: 这里的问题是运算符在Python中(至少)具有两种不同的含义:对于数字类型,这意味着“将数字加在一起”: …,对于序列类型,它的意思是“连接序列”: 通常,Python不会为了使操作“有意义”而隐式地将对象从一种类型转换为另一种类型1,因为这会让人困惑:例如,你可能认为应该表示,但其

  • 描述 (Description) 此方法返回指定子字符串最后一次出现的此字符串中的索引,从指定索引开始向后搜索。 语法 (Syntax) 以下是此方法的语法 - public int lastIndexOf(String str, int fromIndex) 参数 (Parameters) 这是参数的细节 - fromIndex - 从中开始搜索的索引。 str - 一个字符串。 返回值 (R

  • 描述 (Description) 此方法返回指定子字符串第一次出现的字符串中的索引,从指定的索引开始。 如果没有发生,则返回-1。 语法 (Syntax) 以下是此方法的语法 - int indexOf(String str, int fromIndex) 参数 (Parameters) 这是参数的细节 - fromIndex - 从中开始搜索的索引。 str - 一个字符串。 返回值 (Ret

  • 描述 (Description) 此方法接受String作为参数,如果字符串参数作为此对象中的子字符串出现一次或多次,则返回返回的最后一个子字符串的第一个字符的索引。 如果它不作为子字符串出现,则返回-1。 语法 (Syntax) 以下是此方法的语法 - public int lastIndexOf(String str) 参数 (Parameters) 这是参数的细节 - str - 一个字符

  • 描述 (Description) 此方法返回指定子字符串第一次出现的此字符串中的索引。 如果它不作为子字符串出现,则返回-1。 语法 (Syntax) 以下是此方法的语法 - int indexOf(String str) 参数 (Parameters) 这是参数的细节 - str - 一个字符串。 返回值 (Return Value) See the description. 例子 (Exam

  • 描述 (Description) 此方法按字典顺序比较两个字符串,忽略大小写差异。 语法 (Syntax) 以下是此方法的语法 - int compareToIgnoreCase(String str) 参数 (Parameters) 这是参数的细节 - str - 要比较的字符串。 返回值 (Return Value) 此方法返回负整数,零或正整数,因为指定的String大于,等于或小于此St