我想使用类型提示,它是具有某种结构的对象,如下所示:
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
进行子类化以使其自身成为对象类型,但是我无法弄清楚应该使用哪个基类。
答案 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
定义了自己的元类,但是它们都被标记为私有并且没有文档记录,因此最好不要碰它们。