Python方法和返回值(Union)联合类型注解
Posted 算力鬼才信
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python方法和返回值(Union)联合类型注解相关的知识,希望对你有一定的参考价值。
什么是类型注解:供调用者在使用函数(方法)时,如果没有完善的文档作为参考,开发者不知道要给定义的【变量、方法中的函数、】传入什么数据类型,以免减少编译错误。有了类型注解可以让 IDE 知道了数据类型后,更加准确地进行自动补全。
方法中的函数:
def func(data): return data * data func() #编译器只会提示需要传入一个实参,并不会告诉你该传入何种数据类型
如果是python的内置函数random,它就会提示你传入几个参数,出入那一种数据类型
import random random.randint() #生成一个随机数 需要传入起始值和边界值但不包括边界值
自定义函数就不会有这种特殊的待遇,因为python内置函数在封装的时候都已经注释在里面了,因此为更加精准的传入数据,减少错误,我们需要对自定义的函数和变量自己进行注释。
变量的注释方法:
语法1: 变量: 类型 注释前: funck = 10 注释后: funck:int = 10 常用注释方式
语法2: # type: 类型 注释前: funck = 10 注释后: funck = 10 # type:int 在注释中进行类型注释
函数 和 返回值 的注释语法:
函数 :def 函数名(形参:数据类型)
返回值:def 函数名(形参:数据类型) -> 数据类型
函数中类型注释:
def add(x:int,y:int): return x + y add() #提示我们传入两个参数,并且第一个参数和第二个参数都是整形 (int)
返回值注释:
语法: -> 数据类型
注释前 : 只给自定义函数的形参作了类型注解
def func (x:list[int]) """list[int] 表示给形参x,传入数据时,数据类型是一个列表,列表中的元素是 int 整形""" return x
注释后:给定义的函数形参 和返回值都做了类型注解
def func (x:list[int]) -> int: return x
使用Union进行联合类型注解 :
语法: 第一步: 导入 Union 包 from typing import union
第二步:联合注解 my_list: 整体数据类型[union[元素数据类型1,元素数据类型2....,元素数据类型n]]
使用场景: 变量中的参数,需要多种数据类型
案例释义: my_list = [1,"csdn",3.1455] #变量的列表中出现了,三种数据类型。
用以前 my_list:int:str:float = [1,"csdn",3.1455] 这样注释肯定不行
所以正确的是: my_list:list[int,str,float] = [1,"csdn",3.1455]
Union联合类型注解,在变量注解、函数(方法)形参和返回值注解中,均可使用。
函数 和 返回值中使用union 联合注解:
def add(data:Union[float,int]) -> Union[float,int]: return data
-> union[float,int] 这一段指的是返回值 return data中返回的data的数据类型中存有float,int
这里有一个 bug 关于 union 导入会出现问题
目前我通过pip命令下载 typeing 和 union 第三方库,但是问题好像没有被解决掉。
原因是因为: 第三方库 Union 中 的 U是大写的U,我写成了union 所以不能识别 typeing 中没有union 小写这个方法,有的是大写U的 Union。
有一位【CSDN】的作者也解决了在导入Union函数时报错的问题,我把作者的作品Url:
放置如下。
总结: 【论语二则】
君子之过也,如日月之食焉。过也,人皆见之;更也,人皆仰之。
不患人之不知己,患不知人也。
不必担心别人不知道自己,时刻警惕着记好别人。
寓意儒学中蕴含做人的基本原则,谦逊谨慎坦诚
Typescript Union To Intersection 返回值从不
【中文标题】Typescript Union To Intersection 返回值从不【英文标题】:Typescript Union To Intersection returns values as never 【发布时间】:2020-08-24 21:03:48 【问题描述】:我的问题是参考这篇文章
Transform union type to intersection type
每当我将联合转换为交集时,我都会失去联合类型,这是我为解决这个问题而编写的一些代码
type SomeUnion = 'A' | 'B';
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never
type UnionToInterSectionWoNever<T> =
[K in keyof UnionToIntersection<T>]: UnionToIntersection<T>[K] extends never ? T[K] : UnionToIntersection<T>[K]
;
type UnionDistribution<T> = T extends SomeUnion ?
unionType: T & (
T extends 'A' ? aProp1: string, aProp2: number :
T extends 'B' ? bProp1: string : never) :
never;
type ABUnion = UnionDistribution<SomeUnion>;
type ABInterSection = UnionToIntersection<ABUnion>;
type ABInterSectionWoNever = UnionToInterSectionWoNever<ABUnion>;
// This in infered as never;
type ABInterSectionUnionType = ABInterSection['unionType'];
// This in inferred as 'A' | 'B'
type ABInterSectionWoNeverUnionType = ABInterSectionWoNever['unionType'];
所以我对代码不是 100% 有信心,重新考虑一下会很有帮助。 当这样的事情会失败以及如何解决同样的事情时,我很好奇。
提前致谢。
【问题讨论】:
我不明白这一点。给定A
和B
类型,UnionToIntersection<A | B>
按预期返回A & B
。没有never
,没有过度工程。可能是我没有得到你想要得到的东西,抱歉。
'AbIntersection' 中的 'unionType' 类型返回为从不返回,后者不是这种情况......
never
是'A' & 'B'
的正确交集。你认为结果应该是什么,为什么?
【参考方案1】:
您得到never
,因为TypeScript 不能将类型表示为'A' & 'B'
。
看看这个:
type test =
foo: 'bar',
&
foo: 'baz',
// never
type test2 = 'A' & 'B' // never
偶尔会在TS Challenge issue 中找到。
【讨论】:
以上是关于Python方法和返回值(Union)联合类型注解的主要内容,如果未能解决你的问题,请参考以下文章