Các câu trả lời khác đã thực hiện một công việc tốt trong việc giải thích việc gõ vịt và câu trả lời đơn giản của tzot:
Python không có biến, giống như các ngôn ngữ khác trong đó các biến có loại và giá trị; Nó có tên chỉ vào các đối tượng, trong đó biết loại của chúng.
Tuy nhiên, một điều thú vị đã thay đổi kể từ năm 2010 [khi câu hỏi được đặt ra lần đầu tiên], cụ thể là việc thực hiện PEP 3107 [được thực hiện trong Python 3]. Bây giờ bạn thực sự có thể chỉ định loại tham số và loại trả về của một hàm như thế này:, one interesting thing has changed since 2010 [when the question was first asked], namely the implementation of PEP 3107 [implemented in Python 3]. You can now actually specify the type of a parameter and the type of the return type of a function like this:
def pick[l: list, index: int] -> int:
return l[index]
Ở đây chúng ta có thể thấy rằng pick
có 2 tham số, danh sách l
và số nguyên index
. Nó cũng sẽ trả về một số nguyên.
Vì vậy, ở đây có nghĩa là l
là một danh sách các số nguyên mà chúng ta có thể thấy mà không cần nỗ lực nhiều, nhưng đối với các chức năng phức tạp hơn, nó có thể hơi khó hiểu về những gì danh sách nên chứa. Chúng tôi cũng muốn giá trị mặc định là index
là 0. Để giải quyết điều này, bạn có thể chọn viết pick
như thế này: thay vào đó:
def pick[l: "list of ints", index: int = 0] -> int:
return l[index]
Lưu ý rằng bây giờ chúng tôi đặt vào một chuỗi là loại l
, được cho phép về mặt cú pháp, nhưng nó không tốt cho việc phân tích cú pháp theo chương trình [mà chúng tôi sẽ quay lại sau].
Điều quan trọng cần lưu ý là Python sẽ không tăng
def pick[l: "list of ints", index: int = 0] -> int:
return l[index]
3 nếu bạn chuyển phao vào index
, lý do cho đây là một trong những điểm chính trong triết lý thiết kế của Python: "Tất cả chúng ta đều đồng ý với người lớn ở đây", có nghĩa là bạn Dự kiến sẽ nhận thức được những gì bạn có thể chuyển đến một chức năng và những gì bạn không thể. Nếu bạn thực sự muốn viết mã ném Kiểu mẫu, bạn có thể sử dụng chức năng def pick[l: "list of ints", index: int = 0] -> int:
return l[index]
5 để kiểm tra xem đối số được truyền có thuộc loại thích hợp hay một lớp con như thế này không:def pick[l: list, index: int = 0] -> int:
if not isinstance[l, list]:
raise TypeError
return l[index]
Thông tin thêm về lý do tại sao bạn hiếm khi làm điều này và những gì bạn nên làm thay vào đó được nói đến trong phần tiếp theo và trong các bình luận.
PEP 3107 không chỉ cải thiện khả năng đọc mã mà còn có một số trường hợp sử dụng phù hợp mà bạn có thể đọc ở đây.here.
Chú thích loại được chú ý nhiều hơn trong Python 3.5 với việc giới thiệu PEP 484 giới thiệu một mô -đun tiêu chuẩn
def pick[l: "list of ints", index: int = 0] -> int:
return l[index]
6 cho các gợi ý loại.Những gợi ý loại này đến từ loại Checker MyPy [GitHub], hiện đang tuân thủ PEP 484.
Mô -đun
def pick[l: "list of ints", index: int = 0] -> int:
return l[index]
6 đi kèm với một bộ sưu tập khá toàn diện các gợi ý loại, bao gồm:
8,def pick[l: "list of ints", index: int = 0] -> int: return l[index]
9,def pick[l: "list of ints", index: int = 0] -> int: return l[index]
0,def pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
1 - chodef pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
2,def pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
3,def pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
4 vàdef pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
5.def pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
6 - hữu ích cho máy phát điện.def pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
7 - Khi nó có thể là bất cứ điều gì.def pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
8 - Khi nó có thể là bất cứ điều gì trong một tập hợp các loại được chỉ định, trái ngược vớidef pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
7.def pick[l: list, index: int = 0] -> int: if not isinstance[l, list]: raise TypeError return l[index]
0 - Khi nó có thể là không có. Tốc ký chofrom typing import List def pick[l: List[int], index: int] -> int: return l[index]
1.might be None. Shorthand forfrom typing import List def pick[l: List[int], index: int] -> int: return l[index]
1.from typing import List def pick[l: List[int], index: int] -> int: return l[index]
2 - Được sử dụng với thuốc generic.from typing import List def pick[l: List[int], index: int] -> int: return l[index]
3 - Được sử dụng chủ yếu cho các chức năng, nhưng có thể được sử dụng cho các thiết bị gọi khác.from typing import List def pick[l: List[int], index: int] -> int: return l[index]
Đây là những gợi ý loại phổ biến nhất. Một danh sách đầy đủ có thể được tìm thấy trong tài liệu cho mô -đun gõ.
Dưới đây là ví dụ cũ sử dụng các phương thức chú thích được giới thiệu trong mô -đun gõ:
from typing import List
def pick[l: List[int], index: int] -> int:
return l[index]
Một tính năng mạnh mẽ là
from typing import List
def pick[l: List[int], index: int] -> int:
return l[index]
3 cho phép bạn nhập các phương thức chú thích có chức năng như một đối số. Ví dụ:from typing import Callable, Any, Iterable
def imap[f: Callable[[Any], Any], l: Iterable[Any]] -> List[Any]:
"""An immediate version of map, don't pass it any infinite iterables!"""
return list[map[f, l]]
Ví dụ trên có thể trở nên chính xác hơn với việc sử dụng
from typing import List
def pick[l: List[int], index: int] -> int:
return l[index]
2 thay vì def pick[l: list, index: int = 0] -> int:
if not isinstance[l, list]:
raise TypeError
return l[index]
7, nhưng điều này đã được để lại như một bài tập cho người đọc vì tôi tin rằng tôi đã điền vào câu trả lời của mình với quá nhiều thông tin về các tính năng mới tuyệt vời được kích hoạt bằng cách loại .Trước đây khi một mã Python được ghi lại với Sphinx, một số chức năng ở trên có thể thu được bằng cách viết các tài liệu được định dạng như thế này:
def pick[l, index]:
"""
:param l: list of integers
:type l: list
:param index: index at which to pick an integer from *l*
:type index: int
:returns: integer at *index* in *l*
:rtype: int
"""
return l[index]
Như bạn có thể thấy, điều này mất một số dòng bổ sung [con số chính xác phụ thuộc vào mức độ rõ ràng bạn muốn và cách bạn định dạng tài liệu của mình]. Nhưng bây giờ nó sẽ rõ ràng với bạn cách PEP 3107 cung cấp một giải pháp thay thế theo nhiều cách [tất cả?] Điều này đặc biệt đúng khi kết hợp với PEP 484, như chúng ta đã thấy, cung cấp một mô -đun tiêu chuẩn xác định cú pháp cho các gợi ý/chú thích loại này có thể được sử dụng theo cách mà nó không rõ ràng và chính xác sự kết hợp mạnh mẽ.
Theo ý kiến cá nhân của tôi, đây là một trong những tính năng tuyệt vời nhất trong Python từ trước đến nay. Tôi không thể chờ đợi mọi người bắt đầu khai thác sức mạnh của nó. Xin lỗi vì câu trả lời dài, nhưng đây là những gì xảy ra khi tôi cảm thấy phấn khích.
Một ví dụ về mã Python sử dụng nhiều loại có thể được tìm thấy ở đây.