将空元组分配给专用变量时的类型不兼容
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 模拟不兼容