Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么我拒绝我的“混合联盟”类型声明?

为什么我拒绝我的“混合联盟”类型声明?
EN

Stack Overflow用户
提问于 2020-07-14 09:29:34
回答 2查看 5K关注 0票数 8

解决Python聊天中一个半相关的问题的时候,我遇到了一些我不明白的行为。

代码语言:javascript
运行
AI代码解释
复制
from typing import Union, List, Dict

def f(x: Union[
            Dict[str, float],
            Dict[str, str],
            Dict[str, int],
    ]):
        pass

f({"a": 1})     #passes
f({"a": "b"})   #passes
f({"a": 1.0})   #passes

def g(x: Union[
            Dict[str, float],
            Dict[str, Union[str, int]],
    ]):
        pass

g({"a": 1})     #fails
g({"a": "b"})   #fails
g({"a": 1.0})   #passes

def h(x: Dict[str, Union[float, str, int]]):
    pass

h({"a": 1})     #passes
h({"a": "b"})   #passes
h({"a": 1.0})   #passes

当我在这个脚本上执行mypy时,它只会抱怨中间函数g

代码语言:javascript
运行
AI代码解释
复制
C:\Users\Kevin\Desktop>mypy test.py
test.py:20: error: Argument 1 to "g" has incompatible type "Dict[str, int]"; expected "Union[Dict[str, float], Dict[str, Union[str, int]]]"
test.py:20: note: "Dict" is invariant -- see http://mypy.readthedocs.io/en/latest/common_issues.html#variance
test.py:20: note: Consider using "Mapping" instead, which is covariant in the value type
test.py:21: error: Argument 1 to "g" has incompatible type "Dict[str, str]"; expected "Union[Dict[str, float], Dict[str, Union[str, int]]]"
test.py:21: note: "Dict" is invariant -- see http://mypy.readthedocs.io/en/latest/common_issues.html#variance
test.py:21: note: Consider using "Mapping" instead, which is covariant in the value type
Found 2 errors in 1 file (checked 1 source file)

(正如注释所暗示的,用Dict替换Mapping可以删除错误,但为了解决我必须使用Dict的问题。)

这些错误让我感到惊讶。据我所知,每个函数的类型注释应该简化为同一组类型:键为字符串,值为floats/string/int的dict。那么,为什么只有g有不兼容的类型呢?两个工会的存在不知何故使我感到困惑?

EN

回答 2

Stack Overflow用户

发布于 2020-07-14 10:23:19

这是因为Dict是不变的。它应该是不变的,因为它是可变的。

Dict[str, int]不是Dict[str, Union[str, int]]的一个子类型(尽管intUnion[int, str]的一个子类型)

如果你要这样做呢:

代码语言:javascript
运行
AI代码解释
复制
d: Dict[str, Union[str, int]]
u: Dict[str, int]
d = u  # Mypy error: Incompatible type
d["Key"] = "value"

Mypy认为字典是同质的:它们只包含一种类型。例如,与此形成对比的是,Tuples包含异构数据:允许每个项具有不同的类型。

如果需要异构Dict,可以使用TypedDict,但只需要一组固定的字符串键:

代码语言:javascript
运行
AI代码解释
复制
from typing import List, TypedDict

Mytype = TypedDict('Mytype', {'x': str, 'a': List[str]})
s: Mytype = {"x": "y", "a": ["b"]}

s['a'].append('c')

注意:

除非您使用Python3.8或更高版本(在标准库类型模块中可以使用TypedDict ),否则需要使用pip安装typing_extensions以使用TypedDict

票数 6
EN

Stack Overflow用户

发布于 2020-10-22 06:50:14

问题是键/值需要精确的类型匹配。。这是由MyPy为嵌套类型(g)强制执行的,但对于直接替换( h)则是松散的解释。

Union类型被建模为(虚拟)子类型关系。也就是说,str被认为是Union[str, x]的一个子类型。

  • 这与issubbclass(a, (str, int))检查a是“str还是int”的方式相匹配,而没有说明是哪一种。只要只使用公共特性,我们就可以使用str值代替(str, int)-union。

Dict类型在其键/值类型中是不变的。也就是说,键/值必须与声明的类型完全相同。

  • 对于dict这样的可变类型,键/值都是输入d[k] = v和输出v = d[k]。任何替代品都必须在能力较差的输入下工作,或者提供更有能力的输出--这是不可能的,因为输入和输出必须具有相同的能力。

结合起来,使用Dict[..., Union[str, ...]]需要与Union[str, ...]完全匹配的值--(虚拟)子类型str无效。因此,{"a": "b"}被认为是Dict[str, str],而不是Dict[str, Union[str, int]]的替代品。

由于从逻辑上说,联合遵循的行为与常规类型略有不同,所以MyPy有一些Union。这主要集中在函数签名和重载上,它存在独立的联合数学。因此,某些平面类型替换允许更实际的Union匹配,就像h的情况一样。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62900750

复制
相关文章
在Keras中如何对超参数进行调优?
由于没有一个成熟的理论来解释神经网络,所以配置神经网络通常是困难的,经常被同学们调侃为“炼丹”。
花落花飞去
2018/02/05
16.9K2
在Keras中如何对超参数进行调优?
在 Linux/Mac 下为Python函数添加超时时间
我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做timeout,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常。(当然存在特殊情况timeout 会失效,请看Timeouts and cancellation for humans*[1] 这篇文章中作者的举例,我们不考虑这种特殊情况)。
青南
2020/02/26
1.1K0
在 Linux/Mac 下为Python函数添加超时时间
手把手教你在本机安装spark
最近由于一直work from home节省了很多上下班路上的时间,加上今天的LeetCode的文章篇幅较小,所以抽出了点时间加更了一篇,和大家分享一下最近在学习的spark相关的内容。看在我这么拼的份上,求各位老爷赏个转发。。。
TechFlow-承志
2020/04/14
4.4K0
Jira Epic在完成状态时,如何让Epic在Scrum面板待办事项中不显示?
遇到的问题:Epic在完成状态时,仍旧在Scrum面板待办事项中显示,需要手动将其【标记完成】 而想要的效果是:Epic到完成状态时,Epic自动标记完成
donghui
2019/04/19
2.9K0
Jira Epic在完成状态时,如何让Epic在Scrum面板待办事项中不显示?
日本机器人“赢在技术输在商业” 谁之过?
据《金融时报》网站报道,去年当谷歌收购由2位日本机器人工程师创办的一家微型新创公司Schaft时,让人们对日本面临的威胁突然有了新的认识。包括苹果和亚马逊等新科技公司对机器人技术日益感兴趣。 时
机器人网
2018/04/13
7070
日本机器人“赢在技术输在商业” 谁之过?
在Centos下对Tornado的性能进行测试
    在之前的一篇文章中,我们在1g1核的惨淡硬件环境下,对 uwsgi + django 和 gunicorn+ django 的后端服务进行性能测试,得出结论单台django在简单读库操作下只能抗住大约200左右的并发:在Centos下使用Siege对Django服务进行压力测试
用户9127725
2022/08/08
7630
在Centos下对Tornado的性能进行测试
PECVD等离子增强化学沉积技术
纳米涂层(what)是一种功能性、柔性纳米级厚度的薄膜,具有疏水疏油特性。原理(how)在低温真空腔体内,等离子激发反应气体,在基材(被保护的PCBA)表面开启化学反应,生成纳米级厚度的网状保护膜(防泼溅、防潮、疏水、疏油,防腐蚀、防盐雾、防汗液)。气体沉积工艺保证了全面覆盖(内外,缝隙),均匀性,批量处理,牢固性。
用户10405156
2023/03/06
3210
如何通过VPC在本机搭建局域网
前几天在家里测试一个基于WS-AT的分布式应用,但是连接公司网络的VPN出现了问题,不得不采用VPC在本机搭建一个局域网。虽然以前也做过这样的尝试,可能是很久没有弄过了,一些细节记不清了,所以也折腾了好一阵子。在这里,我特意写一篇文章来介绍基于VPC搭建局域网的整个步骤,没有什么技术含量,只当给具有相同需要的朋友多一个参考。 我现在的Host Machine为Windows 7 Ultimate (X64) ,Virtual Machine为Windows Server 2008 (X86),都是现成的。本
蒋金楠
2018/01/16
2.4K0
如何通过VPC在本机搭建局域网
测试人员在技术面试时的注意事项
过完年了,有很多兄弟姐妹们开始春心萌动了,额不对,是物色新工作机会了,所以小编在此整理了一些面试相关的文章,希望对大家有所帮助!
张树臣
2019/03/04
6330
测试人员在技术面试时的注意事项
在使用Qt5.8完成程序动态语言切换时遇到的问题
因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文件,再通过网上介绍的方式,在 main函数中使用 installTranslator,即可让程序在启动时自动判断语言环境,加载相应语言。 至此,静态语言切换已经完成,下面要做的是动态切换(即不需要重启软件)。 1.首先,令语言能够切换的 GUI组件用的是 QComboBox,信号是 currentIndexChanged,在于这个
用户1653704
2018/06/07
1.7K0
对测试技术在团队的一个简单思考
测试技术带来的是PPT工具还是紧贴业务,服务于业务的小工具,小脚本,PPT工具大部分可能带来的是高大尚的平台,无效不实用,投入成本高,主要用于晋升和给自己镀金的作用;而小脚本,小工具不高大尚,作用大,感觉替代性高,一直在业务线上,没有发展前途,对以后前途和职业发展来讲是阻碍;也许可能是跪久了,站不起来了,迷路了,不知道 南橘北枳这个成语吗?所以测试技术要符合自己的团队和业务进行发展才是最实在的,太虚了,经济不景气,裁的就是这些;
厦门-安仔
2023/03/07
2320
对测试技术在团队的一个简单思考
在Centos下使用Siege对Django服务进行压力测试
    Siege是linux下的一个web系统的压力测试工具,支持多链接,支持get和post请求,可以对web系统进行多并发下持续请求的压力测试。今天我们就使用Siege来对Django进行一次压力测试,看看单台Django服务到底能抗住多少的并发数。
用户9127725
2022/08/08
1.6K0
在Centos下使用Siege对Django服务进行压力测试
微信小程序----wx.getLocation(OBJECT) API在iOS关闭本机定位时,获取定位失败
问题 在做一个小程序时,进入首页需要获取用户的当前位置经纬度,然后去服务器查询当前位置周边的网吧。在安卓关闭定位设置时,wx.getLocation(OBJECT) API依然能够获取当前位置的经纬度;但是iOS如果关闭定位设置,wx.getLocation(OBJECT) API就会失败! 解决办法 微信小程序社区解决办法 根据官网解决的实际用法 Page({ onShow(){ // 获取当前地址 wx.getLocation({
Rattenking
2021/02/01
1.4K0
CPU 摸鱼时,在干嘛?
假设你正在用计算机浏览网页,当网页加载完成后你开始阅读,此时你没有移动鼠标,没有敲击键盘,也没有网络通信,那么你的计算机此时在干嘛?
小林coding
2021/03/30
7820
CPU 摸鱼时,在干嘛?
在定义adt时_ScriptableObject
Mutators 变值器(改变对象属性的方法) 通常范围void,如果返回void,则必然意味着它改变了某些对象的内部状态,也可能范围非空类型(如容器类的put、add方法)
全栈程序员站长
2022/10/02
3060
curl在CDN排障中的常见用法
-I Show document info only 只展示headers,发起HEAD请求 -o Write output to file instead of stdout 保存到本地 -x 用这个option可以指定http访问所使用的proxy服务器及其端口 -v Make the operation more talkative 可以显示一次http通信的整个过程,包括端口连接和http -H Custom header to pass to server 添加header -A/–user-agent [string] 指定UA访问 -e, --referer URL 指定referer --resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS -X -d 这里的X是大写,-X POST发起POST请求
邪恶の大灰
2019/04/29
3.6K0
点击加载更多

相似问题

goBack屏在排毒测试中的应用

60

排毒只测试飞溅屏

10

排毒测试还没有完成

10

在反应本机溅屏中显示ActivityIndicator 5秒

110

如何使用react本机-i18n在排毒[反应-本机]

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档