Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python类型暗示类型作为输入_Python_Types_Type Hinting - Fatal编程技术网

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

我想使用python类型暗示并将参数定义为
数据类型
。最好只允许
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
只允许类型作为输入。