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:

放置如下。

http://t.csdn.cn/2ij9q  

总结: 【论语二则】

君子之过也,如日月之食焉。过也,人皆见之;更也,人皆仰之。

不患人之不知己,患不知人也。

不必担心别人不知道自己,时刻警惕着记好别人。

寓意儒学中蕴含做人的基本原则,谦逊谨慎坦诚

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% 有信心,重新考虑一下会很有帮助。 当这样的事情会失败以及如何解决同样的事情时,我很好奇。

提前致谢。

【问题讨论】:

我不明白这一点。给定AB 类型,UnionToIntersection&lt;A | B&gt; 按预期返回A &amp; B。没有never,没有过度工程。可能是我没有得到你想要得到的东西,抱歉。 'AbIntersection' 中的 'unionType' 类型返回为从不返回,后者不是这种情况...... never'A' &amp; 'B' 的正确交集。你认为结果应该是什么,为什么? 【参考方案1】:

您得到never,因为TypeScript 不能将类型表示为'A' &amp; 'B'

看看这个:

type test = 
  foo: 'bar',
 & 
  foo: 'baz',
 // never

type test2 = 'A' & 'B' // never

偶尔会在TS Challenge issue 中找到。

【讨论】:

以上是关于Python方法和返回值(Union)联合类型注解的主要内容,如果未能解决你的问题,请参考以下文章

联合体(union)的使用方法和其本质

联合体(union)的使用方法及其本质

20160402_[转]联合体(union)的使用方法及其本质

python限定方法参数类型返回值类型变量类型等

名词解析—联合体

如何从 GraphQL Mutation 返回 Union 类型