将空元组分配给专用变量时的类型不兼容

Posted

技术标签:

【中文标题】将空元组分配给专用变量时的类型不兼容【英文标题】:Incompatible types when assigning an empty tuple to a specialised variable 【发布时间】:2019-12-25 05:46:48 【问题描述】:

我有一个变量path,它应该是一个字符串元组。我想先将它设置为一个空元组,但 mypy 抱怨。

path: Tuple[str] = ()

错误是:

赋值中的类型不兼容(表达式的类型为“Tuple[]”,变量的类型为“Tuple[str]”)

如何将空元组分配给类型化变量?

动机

我想这样做的原因是:我想动态构建元组,元组(不像列表)可以用作字典键。例如(不是我实际在做的):

for line in fileob:
    path += (line,)
some_dict[path] = some_object

这很好用,除了 mypy 不喜欢上面的类型声明。我可以使用列表,然后将其转换为元组,但这会使代码复杂化。

【问题讨论】:

我认为您正在寻找的是一个列表,而不是一个元组。元组是一种不可更改的数据类型。 @Azer 谢谢 - 我添加了一个关于我为什么要使用元组的部分。 【参考方案1】:

编辑:

您可以像这样定义variable length, homogenous tuple:

Tuple[str, ...]

您还可以使用typing.Union 创建“a 或 b”类型变量:

from typing import Union

path: Union[Tuple[()], Tuple[str]] = ()

旧答案:

通过尝试将空元组分配给您键入的变量以不允许空元组,您实际上错过了键入变量的要点。

我假设您尝试分配的空元组只是一个标记值,并且您打算稍后在代码中重新分配该变量(分配给仅包含字符串的元组。)

在这种情况下,只需将标记值设为包含字符串的元组即可:

path: Tuple[str] = ('token string')

这应该会停止错误消息。

【讨论】:

谢谢,但我正在做的事情的性质需要一个空元组作为起点。我宁愿不要在其中放置一个虚拟值,只是为了解决打字系统的限制。 @z0r 我明白了。你的问题现在很有意义。我编辑了答案以包含我认为更适合您的用例的解决方案。

以上是关于将空元组分配给专用变量时的类型不兼容的主要内容,如果未能解决你的问题,请参考以下文章

从二维数组中的“char *”类型错误分配给“char [100] [100]”类型时的类型不兼容

不兼容的转换字符

将单选组分配给单选按钮

OCHamcrest 匹配器参数与验证时的 Mockito 模拟不兼容

当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 int 不兼容”错误?

类型参数 t 具有不兼容的上限视图和列表视图