当前位置: 首页 > 面试题库 >

在Python 3.6中运行时根据Union类型检查变量

能向晨
2023-03-14
问题内容

更新(2020年9月) :Python

3.9包含typing.get_type_hints此用例的功能,请参阅https://docs.python.org/3.9/library/typing.html#typing.get_type_hints

我正在尝试编写一个使用Python 3.6类型提示的函数装饰器,以检查参数字典是否尊重类型提示,并且如果未出现带有问题清晰说明的错误,则将其用于HTTP
API。

问题是,当函数具有使用Union类型的参数时,我无法在运行时根据其检查变量。

例如我有这个功能

from typing import Union
def bark(myname: str, descr: Union[int, str], mynum: int = 3) -> str:
    return descr + myname * mynum

我可以:

isinstance('Arnold', bark.__annotations__['myname'])

但不是:

isinstance(3, bark.__annotations__['descr'])

因为Union不能与isinstance或一起使用issubclass

我找不到使用类型对象检查它的方法。我尝试自己执行检查,但是在REPL中bark.__annotations__['descr']显示typing.Union[int, str]时,如果不使用检查的丑陋技巧,我将无法在运行时访问类型列表bark.__annotations__['descr'].__repr__()

是否有访问此信息的正确方法?还是故意在运行时不易于访问它?


问题答案:

您可以使用其中包含“可能内容”的__args__属性:Union``tuple

>>> from typing import Union

>>> x = Union[int, str]
>>> x.__args__
(int, str)
>>> isinstance(3, x.__args__)
True
>>> isinstance('a', x.__args__)
True

__args__参数未记录下来,因此可以认为是“与实现细节打交道”,但它似乎比解析更好repr



 类似资料:
  • 我试图编写一个函数装饰器,它使用Python 3.6类型提示来检查参数字典是否尊重类型提示,如果没有清晰描述问题,则会产生错误,用于HTTP API。 问题是,当函数有一个使用类型的参数时,我无法在运行时对照它检查变量。 比如我有这个功能 我可以做到: 但不是: 因为不能与或一起使用。 我找不到使用type对象检查它的方法。我试图自己实现检查,但当显示为我不能在运行时访问类型列表,如果不使用检查。

  • 问题内容: 我几乎没有这样声明的C函数 我想将这些作为一个Go函数公开 所以我需要能够在运行时检查 参数 类型。我该怎么做,这是个好主意吗(如果不是,在这种情况下,什么是好的做法)? 问题答案: 在此处查看类型断言: http://golang.org/ref/spec#Type_assertions 我只断言一个明智的类型(字符串,uint64)等,并使其尽可能宽松,最后执行到本机类型的转换。

  • 我试图找到一种方法来传递一个对象来发挥作用,并在运行库中检查它的类型。这是一个伪代码: 但是总是返回,我无法找到获取或的真正类型的方法。也不起作用,返回了相同的内容。

  • 本文向大家介绍TypeScript 运行时类型检查补充工具,包括了TypeScript 运行时类型检查补充工具的使用技巧和注意事项,需要的朋友参考一下 TypeScript是静态类型系统,在编译时做类型检查。一般而言,如果项目所用到的所有库、模块都是基于ts的,那么静态类型已经可以避免大部分编程层面的类型问题。不过,在一些场景下来,单纯静态类型是无法解决问题的,部分数据是动态传入到系统中的,主要包

  • 我在android和Kotlin有奇怪的问题。问题是我用类型定义变量,但在运行时更改为 我这样定义我的变量: 我使用kotlin 1.3.71和jvm 1.8。 更新0:

  • 问题内容: 假设通用类型声明(Java) 我如何在运行时实例化一个Type对象,该对象表示通过特定类型T(也仅在运行时才知道)进行参数化的Foo? 问题答案: 我想我明白你的问题。您想要序列化一个,并且在运行时具有class对象(但在编译时不是固定的)。因此,在Gson中建议的创建匿名子类的解决方案不起作用,因为这要求在编译时对参数化类型(例如)进行硬编码,并且如果使用,则该解决方案不起作用。 但