python - 定义一个行为类似于打字的自定义类型。Any

标签 python types type-hinting mypy python-dataclasses

我需要创建一个行为类似于 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"

我尝试过的事情:

  1. 不起作用,因为您无法子类化 Any: TypeError: Cannot subclass <class 'typing._SpecialForm'>

    class MyAny(Any):
       pass
    
  2. 不起作用,因为它与正常的 Any 没有区别(上面代码片段的结果是 It's a\nIt's b )

    MyAny = Any
    
  3. 在运行时工作,但 mypy 提示默认值: Mypy: Incompatible types in assignment (expression has type "None", variable has type "MyAny")

    class MyAny:
       pass
    
  4. 在运行时工作,但 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/

相关文章:

c# - 通用集合类型测试

php - 类变量中的类型提示

python - 类型提示条件可变参数应用程序

python - 按日期和时间查询存储在 MongoDB 中的数据

python - 在 Amazon EC2 上启动 http 服务器

python - 同级文本的 XPath?

java - 逆变类型上的 Kotlin 星投影

python - 记录 Django Haystack 搜索关键字

Haskell 无法创建 TypeClass 的实例

python - 如何通过 python 3.5 输入模块输入提示 collections.OrderedDict