TypedDict
đã được chấp nhận trong Python 3.8 thông qua PEP 589 . Từ Python, nó xuất hiện __total__
là một cờ boolean được đặt thành True
theo mặc định:
tot = TypedDict.__total__
print(type(tot))
print(tot)
# <class 'bool'>
# True
Như đã đề cập trong các bài đăng khác, chi tiết về phương pháp này bị giới hạn trong các tài liệu , nhưng liên kết của @Yann Vernier với mã nguồn CPython gợi ý mạnh mẽ __total__
có liên quan đến total
từ khóa mới được giới thiệu trong Python 3.8 :
# 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
...
Làm thế nào nó hoạt động?
Tóm tắt : theo mặc định, tất cả các khóa được yêu cầu khi khởi tạo một định nghĩa TypedDict
. total=False
ghi đè hạn chế này và cho phép các phím tùy chọn. Xem các cuộc biểu tình sau đây.
Được
Một cây thư mục thử nghiệm:
Mã
Các tập tin trong thư mục thử nghiệm:
# 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"
Bản giới thiệu
Nếu một khóa bị thiếu, mypy sẽ khiếu nại theo dòng lệnh:
> mypy code/rgb_bad.py
code\rgb_bad.py:11: error: Key 'a' missing for TypedDict "Color"
...
Cài đặt total=False
cho phép các phím tùy chọn:
> mypy code/rgb_good.py
Success: no issues found in 1 source file
Xem thêm
- Tweet của R. Hettinger tổng thể quỷ dị
- Phần PEP về tổng số trong PEP 589
- Điều mục trên các loại và
TypedDict
bằng Python 3.8 bởi Real Python
typing-extensions
gói để sử dụng TypedDict
trong Python 3.5, 3.6
typing
nội bộ không được ghi nhận và phần được ghi chép kém.