我需要创建一个行为类似于 typing.Any
的类型当通过类型检查器(mypy)查看时,但与 typing.Any
不同.
用例是一些漂亮的“元”代码,需要从一组可以用typing.Any
注释的其他变量中找到用这种类型注释的变量。 。
请注意,我永远不需要实际创建此类型的实例,我只需要它在数据类上下文中进行类型注释。
示例:
from dataclasses import dataclass, fields
from typing import Any
MyAny = ... # What to put here?
@dataclass()
class Test:
a: Any
b: MyAny = None
for field in fields(Test):
if field.type == MyAny:
print(f"It's {field.name}") # This should print "It's b"
我尝试过的事情:
不起作用,因为您无法子类化 Any:
TypeError: Cannot subclass <class 'typing._SpecialForm'>
class MyAny(Any): pass
不起作用,因为它与正常的 Any 没有区别(上面代码片段的结果是
It's a\nIt's b
)MyAny = Any
在运行时工作,但 mypy 提示默认值:
Mypy: Incompatible types in assignment (expression has type "None", variable has type "MyAny")
class MyAny: pass
在运行时工作,但 mypy 无法判断其行为应类似于
Any
: 它提示这样的定义Mypy: Argument 2 to NewType(...) must be subclassable(got "Any")
它提示默认参数:Mypy: Incompatible types in assignment (expression has type "None", variable has type "MyAny")
from typing import NewType MyAny = NewType("MyAny", Any)
那么有没有办法让这个工作成功呢?
最佳答案
您可以使用条件来欺骗 mypy 解释一段代码,同时让运行时执行另一段代码。
from dataclasses import dataclass, fields
from typing import Any
if False:
MyAny = Any
else:
class MyAny: # type: ignore
pass
@dataclass()
class Test:
a: Any
b: MyAny = None
for field in fields(Test):
if field.type == MyAny:
print(f"It's {field.name}") # This should print "It's b"
关于python - 定义一个行为类似于打字的自定义类型。Any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59360567/