TypedDict:将两个键标记为不兼容

问题描述 投票:0回答:0

我有一个名为

Foo
的界面,除了其他常用键外,它应该具有两个给定键中的一个,
bar
baz
。为了让 Pycharm 知道,我写了两个接口:

from typing import TypedDict

class Foo1(TypedDict):
  bar: str
    
class Foo2(TypedDict):
  baz: int

Foo = Foo1 | Foo2

foo_instance_1: Foo = {  # Works fine
  'bar': 'foobar'
}
foo_instance_2: Foo = {  # Also fine
  'baz': 42
}

foo_instance_3: Foo = {  # Warning: Expected type 'Foo1 | Foo2', got 'dict[str, str | int]' instead
  'bar': 'foobar',
  'baz': 42
}

问题是我正在处理的真实界面不仅仅是一组不兼容的键。话虽这么说,如果有三组分别对应2、3、4键,我就得写

2 * 3 * 4
或者24个接口了。如果存在这样的东西那就太好了:

class Foo(TypedDict):
  bar: IncompatibleWith('baz', 'qux')[str]
  baz: IncompatibleWith('bar', 'qux')[int]
  qux: IncompatibleWith('bar', 'baz')[bool]

# or, better yet:

@incompatible('bar', 'baz', 'qux')
# ...
class Foo(TypedDict):
  bar: str
  baz: int
  qux: bool

现实世界的背景:我正在编写一个源代码生成器来为我无法控制的网站生成 API 接口,使用 Python(该网站的 API 系统有一个用于检索 API 文档的 API)。这些接口仅用于类型提示。虽然我确实可以生成所有组合,但这会使文件更长。

是否有一种简单易行的方法来将接口的一组键标记为彼此不兼容?

python pycharm python-typing typeddict
© www.soinside.com 2019 - 2024. All rights reserved.