- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
typing
模块为泛型类型提示提供了一个基类:typing.Generic
类。
Generic
的子类接受方括号中的类型参数,例如:
list_of_ints = typing.List[int]
str_to_bool_dict = typing.Dict[str, bool]
我的问题是,如何访问这些类型参数?
也就是说,给定 str_to_bool_dict
作为输入,我怎样才能得到 str
和 bool
作为输出?
基本上我正在寻找这样的功能
>>> magic_function(str_to_bool_dict)
(<class 'str'>, <class 'bool'>)
最佳答案
从 Python3.8 开始,有 typing.get_args
:
print( get_args( List[int] ) ) # (<class 'int'>,)
PEP-560还提供了 __orig_bases__[n]
,它允许我们使用第 n 个泛型基的参数:
from typing import TypeVar, Generic, get_args
T = TypeVar( "T" )
class Base( Generic[T] ):
pass
class Derived( Base[int] ):
pass
print( get_args( Derived.__orig_bases__[0] ) ) # (<class 'int'>,)
从 Python 3.6 开始。有一个公共(public) __args__
和 (__parameters__
) 字段。例如:
print( typing.List[int].__args__ )
这包含泛型参数(即 int
),而 __parameters__
包含泛型本身(即 ~T
)。
打字
跟在PEP8之后. PEP8 和 typing
都是由 Guido van Rossum 合着的。双前导和尾随下划线定义为:“存在于用户控制的命名空间”中的“魔术”对象或属性。
dunders 也被在线评论;来自 typing 的官方存储库我们可以看到:
__args__
是下标中使用的所有参数的元组,例如,Dict[T, int].__args__ == (T, int)
".但是,authors also note :
__union_params__
。如果你想在运行时上下文中使用类型,那么你可能会对 typing_inspect
项目感兴趣(其中一部分可能会在以后键入)。 "一般来说,无论您对 typing
做什么,都需要暂时保持最新状态。如果您需要前向兼容的更改,我建议您编写自己的注释类。
关于python - 如何访问 typing.Generic 的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48572831/
generic parameters of trait function 的简单示例: trait Ext: Sized { fn then(self, f: fn(Self) -> R) -
在下面的代码中,为什么 Groovy 似乎忽略了方法 barMany 中提供的闭包参数的泛型类型声明: import groovy.transform.CompileStatic @CompileSt
据我所知,Prolog 没有任何内置机制用于generic programming。 .可以使用统一来模拟泛型,但这需要在运行时进行类型检查: :- initialization(main). :-
在我的应用程序中,我有一个 Board。董事会由细胞组成。每个单元格都有一个 int 值。有几种类型的 Board 可以扩展 Board。每种类型的板将以不同方式表示单元格。例如,一个人会使用 Lis
我想将存储的属性添加到 UIView 子类中,例如UIView、UIImageView、UIPickerView等, 我只需要从子类创建 UIView 的实例子类仅类型不同,所有属性和方法都相同。 T
这个问题在这里已经有了答案: Any type and implementing generic list in go programming language (2 个答案) 关闭 6 个月前。
我有以下代码as seen in ideone.com : import java.util.*; class Test{ interface Visitor{ public
在 Swift 中,我们可以对序列等通用项编写扩展: extension Sequence where Iterator.Element : ObservableType { } 这将保证扩展仅适用于
我知道这听起来很困惑,但这是我能解释的最好的了。 (您可以建议一个更好的标题)。我有 3 节课:- A public class A > { ... } B public class B {
我目前在大学攻读 CS,我刚刚开始学习数据结构和算法类(class)。我的教授非常喜欢(实际上是强制我们)使用 Ada。为了取得成功,我开始查找一些东西并找到了这段代码,它描述了如何编写通用堆栈: g
我正在玩 Scala By Example 开头的 QuickSort 示例并尝试将其调整为通用类型 A ,而不仅仅是 Int s。 到目前为止我的工作是 def sort[A new Y(i, -
谁能解释为什么下面的第二个例子不能编译? “测试 2”给出“错误 FS0670:此代码不够通用。类型变量 ^a 无法泛化,因为它会超出其范围。”。我无法理解此错误消息。 // Test 1 type
如何将泛型存储在非泛型对象持有的泛型TList中? type TXmlBuilder = class type TXmlAttribute= class Name: Str
我正在尝试通过遵循 wiki article 创建如何使用 GHC.Generics 的最小工作示例.这是我所拥有的: {-# LANGUAGE DefaultSignatures, DeriveGe
我正在尝试将 get 函数添加到 wiki 中描述的通用序列化中。 。有些部分看起来很简单,但有一些地方我非常不确定要写什么,毫不奇怪,我遇到了编译错误。我已经查看了原始论文以及 cereal 中的实
为什么这段代码有效? $v):void { print_r($v); } test(Vector {1, array("I'm an array"), 3}); 它不应该抛出错误吗?什么是应
有没有办法让 Rust Generic 只接受原始类型?我想稍后迭代值中的位,并且我知道这只有在原始类型中才有可能。 struct MyStruct { my_property: T // m
假设我有一个简单的类 public class MyObject { } 以及处理MyObject子类的handler接口(interface) public interface MyObjectHa
出于某种原因,我正在努力通过使用通用基类来实现通用接口(interface)的属性,如下所示: public interface IParent where TChild : IChild {
我收到以下错误。 google了一天多,还是找不到具体的解决方法,求大神指点,谢谢 ERROR: Cannot implicitly convert type System.Collections.G
我是一名优秀的程序员,十分优秀!