Python typeddict lấy khóa

Đúng là hàm trả về một

def get_sales_summary() -> dict:
    ...
6, nhưng đó là một kiểu không đầy đủ. Sử dụng
def get_sales_summary() -> dict:
    ...
6 mà không có bất kỳ tham số nào tương đương với
sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
0 và. Điều này có nghĩa là các khóa và giá trị của
def get_sales_summary() -> dict:
    ...
6 trả về của chúng tôi sẽ không được kiểm tra loại trong trình gọi

Ví dụ: Mypy sẽ không thấy bất kỳ vấn đề nào với mã này

sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])

Nhưng nó gặp sự cố với một

sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
3

$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str

Rất tiếc. Hãy thoát khỏi điều đó

sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
1

Được rồi, còn sales_summary = get_sales_summary() print("Sales:" + sales_summary["sales"]) 5 thì sao?

Chúng tôi có thể cải thiện chỉ trên

def get_sales_summary() -> dict:
    ...
6 bằng cách tham số hóa các loại khóa và giá trị của nó

def get_sales_summary() -> dict:
    ...
0

Bây giờ chúng tôi đang khai báo chính xác loại khóa là

sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
7, điều này thật tuyệt

Vì các giá trị trả về có nhiều loại khác nhau nên việc sử dụng

sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
8 là đúng về mặt kỹ thuật. Nó truyền đạt “điều này có thể là bất cứ điều gì” tốt hơn
sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
1. Nhưng nó quá hạn chế và các loại giá trị hiện không xác định tại các trang web cuộc gọi

Ví dụ: lấy mã này

def get_sales_summary() -> dict:
    ...
4

Mypy không thể nói rằng

$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
0 là một
$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
1, vì vậy nó phát sinh lỗi

def get_sales_summary() -> dict:
    ...
7

Để khai báo đúng loại giá trị, chúng ta cần sử dụng , ví dụ

def get_sales_summary() -> dict:
    ...
8

Điều này không hữu ích lắm vì nó đặt gánh nặng của các loại chính xác khỏi hàm vào các trang gọi. Ngoài ra,

$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
3 chưa được xác minh, vì vậy chúng tôi vẫn có thể gặp lỗi loại

Được rồi, $ python example.py Traceback (most recent call last): File "/.../example.py", line 11, in <module> print("Sales:" + sales_summary["sales"]) TypeError: can only concatenate str (not "int") to str 4 ?

Chúng ta có thể sử dụng toán tử kết hợp đánh máy,

$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
5, để khai báo các loại giá trị có thể

sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
2

Điều này ràng buộc các giá trị của chúng tôi là

$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
1 hoặc
sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
7 hoặc
$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
8]. Loại liên kết chính xác hơn
sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
8, cho phép các loại khác nhau vô hạn theo nghĩa đen. Nhưng nó có một nhược điểm - trình kiểm tra loại phải giả sử mỗi giá trị có thể là bất kỳ loại nào được kết hợp

Ví dụ: chúng tôi có thể thử sử dụng lại ________ 100 làm ________ 61

def get_sales_summary() -> dict:
    ...
4

Nhưng mypy cho chúng tôi biết rằng phép chia sẽ không hoạt động trong trường hợp

$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
0 có thể là
sales_summary = get_sales_summary()
print("Sales:" + sales_summary["sales"])
7 hoặc
def get_sales_summary() -> dict:
    ...
04

def get_sales_summary() -> dict:
    ...
0

Một lần nữa, chúng ta cần sử dụng một

$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
3 khó chịu

def get_sales_summary() -> dict:
    ...
8

Điều này đi kèm với các vấn đề tương tự như trước đây

Aha - một def get_sales_summary() -> dict: ... 06

Bây giờ chúng tôi đến giải pháp trong tiêu đề. cho phép chúng tôi khai báo cấu trúc cho các

def get_sales_summary() -> dict:
    ...
6, ánh xạ các khóa (chuỗi) của chúng với các loại giá trị của chúng

def get_sales_summary() -> dict:
    ...
06 đã được chỉ định trong PEP 589 và được giới thiệu trong Python 3. 8. Trên các phiên bản Python cũ hơn, bạn có thể cài đặt nó từ phần mở rộng gõ

Chúng ta có thể sử dụng nó như vậy

def get_sales_summary() -> dict:
    ...
2

Bây giờ chúng tôi có thể truy cập

def get_sales_summary() -> dict:
    ...
00 mà không cần một
$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
3

def get_sales_summary() -> dict:
    ...
4

Mypy biết rằng

$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
0 là một
$ python example.py
Traceback (most recent call last):
  File "/.../example.py", line 11, in <module>
    print("Sales:" + sales_summary["sales"])
TypeError: can only concatenate str (not "int") to str
1, vì vậy nó cho phép tệp vượt qua

def get_sales_summary() -> dict:
    ...
4

Và chúng ta có thể chạy mã mà không gặp lỗi

def get_sales_summary() -> dict:
    ...
5

Tuyệt quá

Vây

Cảm ơn David Foster vì đã tạo ra

def get_sales_summary() -> dict:
    ...
06. Nếu bạn muốn thử kiểm tra các loại
def get_sales_summary() -> dict:
    ...
06 trong thời gian chạy, hãy xem dự án
def get_sales_summary() -> dict:
    ...
46 của anh ấy