定义使用的自定义类型`键入。获取\键入\提示()`

2021-09-17 00:00:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

是否可以使用新的注释行为来实现这一点?据我所知,我需要对MyType进行子类化,使其对象本身成为类型,但我无法确定应该使用哪个基类。你知道吗

2条回答
网友
1楼 ·

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

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定义了自己的元类,但是它们都被标记为私有的并且没有文档记录,所以最好不要碰它们。你知道吗

网友
2楼 ·

typing.get_type_hints()将尝试将任何可能是forward references的注释转换为类型。你知道吗

在您的示例中,a的注释不是type的子类,因为它是MyType实例MyType本身type的一个子类。你知道吗

也许你的代码就是这么写的?在大多数情况下,用类型的实例注释函数没有多大意义。你知道吗

def func(a: MyType):
    pass

相关问题