python类型暗示类型作为输入
我想使用python类型暗示并将参数定义为python类型暗示类型作为输入,python,types,type-hinting,Python,Types,Type Hinting,我想使用python类型暗示并将参数定义为数据类型。最好只允许str,int,float,bool,或None(但我想这是数据类型的值,不是类型,我可以手动检查)。我该怎么做 我的函数如下所示: 导入键入 Savable=typing.Union[str,int,float,bool,None] 数据类型=类型。任何#布尔值: #以某种方式保存变量,以便**必须**知道数据类型, #为了保留空间 通过 def load_variable_persistent(键:str,数据类型:dataty
数据类型
。最好只允许str
,int
,float
,bool
,或None
(但我想这是数据类型的值,不是类型,我可以手动检查)。我该怎么做
我的函数如下所示:
导入键入
Savable=typing.Union[str,int,float,bool,None]
数据类型=类型。任何#布尔值:
#以某种方式保存变量,以便**必须**知道数据类型,
#为了保留空间
通过
def load_variable_persistent(键:str,数据类型:datatype):
#从**需要**知道类型的某个后端接口加载值
通过
我不知道如何将数据类型定义为只允许类型
我所做的
思想1(错误):使用键入.Union[int,str,…]
,但这没有意义,因为这将允许int和str的实例。这将使数据类型
与错误的可保存
相同
思想2(错误):当我使用python和键入
>>> int
<class 'int'>
>>int
它说int
是int
-class(?)的一个实例。所以我需要一个输入。允许int
-类的实例加上str
-类的实例的联合,依此类推(?)。但是int
-类的实例是整数,所以数字也是整数。str
类的实例就是字符串本身。此外,这意味着使用键入。并集[int,str,…]
所以我又回到了与Savable
相等的位置
思想3:上面说,int
是一个类型。这意味着我应该使用typing.Type
来表示Datatype
。另外type(int)=typing.type
返回True
思想4:使用类型(int)
返回
。但是typing.Type==Type
返回False
3和4使我认为,typing.Type
和Type
只是包含信息的类,例如int
,但不是int
的类型/类
那么,我应该用什么呢Datatype=typing.Type
,Datatype=Type
或完全不同的东西?你的直觉是,键入.Type
是正确的。这里的文档非常好,即使它们没有解释为什么type=键入。键入
- 如果要允许任何类型,请使用
类型
(或等效的类型
或类型[Any]
,即使=
比较表明它们不同)
- 如果希望协变地允许任何一组固定类型,请使用
Type[Union[str,int等]]
- 如果您想使用泛型,请使用
Type[T]
(例如def-foo(a:T,a_-Type:Type[T])
)(如果您还不知道如何使用泛型,请查找TypeVar)
“它说int是int类的一个实例”-不,它说int
是一个名为“int”的类。您是否试图描述泛型,即Savable和Database应该有匹配的类型?为什么datatype
是一个参数?听起来你可以使用type(value)
@user2357112supportsMonica,因为我可能有int
s和float
s的值。如果我得到int
值,我仍然必须知道这个值也可能是float
。除此之外,我还需要另一种方式,这样我就知道要加载多少字节。但这对函数来说是非常特殊的。@jornsharpe在大多数情况下它们都匹配,请查看我上面的评论。但这不是我的主要目标,我只想让datatype
只允许类型作为输入。