当键的名称无效时 TypedDict

joh*_*hng 11 python dictionary typing python-3.x

如果我在字典中有一个带有无效标识符的键,例如A(2). 如何TypedDict使用此字段创建一个?

例如

from typing import TypedDict

class RandomAlphabet(TypedDict):
    A(2): str
Run Code Online (Sandbox Code Playgroud)

不是有效的 Python 代码,导致错误:

from typing import TypedDict

class RandomAlphabet(TypedDict):
    A(2): str
Run Code Online (Sandbox Code Playgroud)

保留关键字也有同样的问题:

class RandomAlphabet(TypedDict):
    return: str
Run Code Online (Sandbox Code Playgroud)

抛出:

SyntaxError: illegal target for annotation
Run Code Online (Sandbox Code Playgroud)

Geo*_*rgy 14

根据PEP 589,您可以使用替代语法来创建TypedDict如下:

Movie = TypedDict('Movie', {'name': str, 'year': int})

所以,在你的情况下,你可以写:

from typing import TypedDict

RandomAlphabet = TypedDict('RandomAlphabet', {'A(2)': str})
Run Code Online (Sandbox Code Playgroud)

或者对于第二个例子:

RandomAlphabet = TypedDict('RandomAlphabet', {'return': str})
Run Code Online (Sandbox Code Playgroud)

不过,PEP 589警告说:

但是,此语法不支持继承,并且无法在单一类型中同时具有必需字段和非必需字段。这样做的动机是保持向后兼容的语法尽可能简单,同时涵盖最常见的用例。

  • 很高兴知道我的思路是正确的,但我真的希望有比这更好的方法 - 如果单个键中包含连字符,类语法就会中断,这远非理想!我希望来自数据类字段之类的东西。 (4认同)

Gra*_*zan 9

这相当混乱,但如果您需要继承,它就可以工作。

class RandomAlphabet(
    TypedDict(
        "RandomAlphabet",
        {"A(2)": str, "return": str},
    ),
    SomeInheritedTypedDict,
):
    pass
Run Code Online (Sandbox Code Playgroud)

您还可以替换pass为不使用无效标识符或保留关键字(如果有)的其他正常属性。