定义一个与typing.get_type_hints()一起使用的自定义类型

时间:2019-08-11 04:27:09

标签: python typehints

我想使用类型提示,它是具有某种结构的对象,如下所示:

import typing


class MyType:
    def __init__(self, param):
        self.param = param


def func(a: MyType(1)):
    pass


print(typing.get_type_hints(func))

运行正常,产生

{'a': <__main__.MyType object at 0x107a3c110>}

但是如果有人添加

from __future__ import annotations

在代码开头,模仿Python 3.8+的默认行为(将注释转换为在get_type_hints()中求值的字符串),它会产生错误

TypeError: Forward references must evaluate to types. Got <__main__.MyType object at 0x10f4ff0d0>

是否可以通过新的注释行为来实现此目的?据我了解,我需要对MyType进行子类化以使其自身成为对象类型,但是我无法弄清楚应该使用哪个基类。

2 个答案:

答案 0 :(得分:0)

typing.get_type_hints()将尝试将可能是forward references的所有注释转换为类型。

在您的示例中,a的注释不是type的子类,因为它是MyType instance MyType本身 type的子类。

也许您的代码是要这样说的?在大多数情况下,用类型的实例注释函数没有多大意义。

def func(a: MyType):
    pass

答案 1 :(得分:0)

似乎一种可能的方法是创建一个元类:

class MyType(type):

    def __new__(cls, param):
        return super().__new__(cls, f'MyType({param})', (MyType,), {})

    def __init__(self, param):
        self.param = param

这满足get_type_hints()

typing定义了自己的元类,但是它们都被标记为私有并且没有文档记录,因此最好不要碰它们。

相关问题