在新发布的Python 3.8中,有一个新类型的注释typing.TypedDict
。其文档中提到
可以通过
Point2D.__annotations__
和访问用于自省的类型信息Point2D.__total__
。[....]
虽然__annotations__
是众所周知的,但已在PEP 3107中引入,但我在上找不到任何信息__total__
。谁能解释它的含义,并在可能的情况下链接到权威资料来源?
在新发布的Python 3.8中,有一个新类型的注释typing.TypedDict
。其文档中提到
可以通过
Point2D.__annotations__
和访问用于自省的类型信息Point2D.__total__
。[....]
虽然__annotations__
是众所周知的,但已在PEP 3107中引入,但我在上找不到任何信息__total__
。谁能解释它的含义,并在可能的情况下链接到权威资料来源?
Answers:
我猜想该__total__
字段表示实例是否必须完整(默认)或(所有字段可选)。我从PEP 589开始搜索,PEP 589对此进行了介绍TypedDict
和描述。它使用了一个total
参数,将class
语法重命名为dunder样式将很有意义。但是,我没有发现何时进行这样的重命名。
查看MyPy(这是关心这些批注的实际类型检查器),上面有关于TypedDict
and totality的相似文档,但同样没有引用dunder语法。深入研究其实现会导致更多的混乱,因为TypedDictType
在types.py中没有总字段,而是将items
和分开required_keys
。总体而言,这意味着items.keys()==required_keys
但该实现会做出不同的假设,例如单独can_be_false
依赖items
。total=False
原则上应该required_keys
是空的。
_TypedDictMeta的CPython源代码至少表明该total
参数和__total__
dunder是相同的,尽管该源代码将TypedDict
自身描述为“可能会很快添加”。
can_be_false
是MyPy错误,可能与从一开始就没有计划具有可选字段有关。
TypedDict
已通过PEP 589在Python 3.8中接受。在Python中,似乎__total__
是一个True
默认设置为boolean标志:
tot = TypedDict.__total__
print(type(tot))
print(tot)
# <class 'bool'>
# True
如其他文章所述,有关此方法的详细信息在文档中受到限制,但是@Yann Vernier指向CPython源代码的链接强烈建议__total__
与Python 3.8中引入的new total
关键字相关:
# cypthon/typing.py
class _TypedDictMeta(type):
def __new__(cls, name, bases, ns, total=True):
"""Create new typed dict class object.
...
"""
...
if not hasattr(tp_dict, '__total__'):
tp_dict.__total__ = total
...
它是如何工作的?
简介:默认情况下,实例化define时需要所有键TypedDict
。 total=False
覆盖此限制并允许使用可选键。请参见以下演示。
给定
测试目录树:
码
测试目录中的文件:
# rgb_bad.py
from typing import TypedDict
class Color(TypedDict):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
# rgb_good.py
from typing import TypedDict
class Color(TypedDict, total=False):
r: int
g: int
b: int
a: float
blue = Color(r=0, g=0, b=255) # missing "a"
演示版
如果缺少密钥,mypy将在命令行中抱怨:
> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...
设置total=False
允许使用可选键:
> mypy code/rgb_good.py
Success: no issues found in 1 source file
也可以看看
TypedDict
typing-extensions
TypedDict
在Python 3.5、3.6中使用的软件包
typing
内部零件没有记录,并且零件记录得很差。