Hướng dẫn python local variable type hint - gợi ý kiểu biến cục bộ python
Trạng tháiThông báo cho người đánh giá Show
Thông báo cho người đánh giátrừu tượng Cơ sở lý luận Sự chỉ rõ trừu tượngCơ sở lý luận # 'primes' is a list of integers primes = [] # type: List[int] # 'captain' is a string (Note: initial value is a problem) captain = ... # type: str class Starship: # 'stats' is a class variable stats = {} # type: Dict[str, int] Sự chỉ rõ primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {} Chú thích biến toàn cầu và địa phương Cơ sở lý luậnSự chỉ rõ
Hiệu ứng thời gian chạy của các chú thích loại Non-goalsCác công dụng khác của chú thích Các đề xuất bị từ chối/hoãn lạiPython will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention. Type annotations should not be confused with variable declarations in statically typed languages. The goal of annotation syntax is to provide an easy way to specify structured type metadata for third party tools. Khả năng tương thích ngược Sự chỉ rõChú thích biến toàn cầu và địa phương my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime. Chú thích biến lớp và phiên bản var = value # type: annotation var: annotation; var = value var: annotation = value Chú thích biểu thức Nơi chú thích aren cho phép Chú thích biến toàn cầu và địa phươngCác loại người dân địa phương và toàn cầu có thể được chú thích như sau: some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value Có thể bỏ qua giá trị ban đầu cho phép gõ các biến dễ dàng hơn được gán trong các nhánh có điều kiện: sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False Lưu ý rằng, mặc dù cú pháp không cho phép đóng gói tple, nhưng nó không cho phép người ta chú thích các loại biến khi sử dụng việc giải nén tuple: # Tuple packing with variable annotation syntax t: Tuple[int, ...] = (1, 2, 3) # or t: Tuple[int, ...] = 1, 2, 3 # This only works in Python 3.8+ # Tuple unpacking with variable annotation syntax header: str kind: int body: Optional[List[str]] header, kind, body = message Bỏ qua giá trị ban đầu để lại biến không chính xác: a: int print(a) # raises NameError Tuy nhiên, việc chú thích một biến cục bộ sẽ khiến thông dịch viên luôn biến nó thành một địa phương: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}0 Như thể mã là: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}1 Chú thích loại trùng lặp sẽ bị bỏ qua. Tuy nhiên, trình kiểm tra loại tĩnh có thể đưa ra cảnh báo cho các chú thích của cùng một biến theo một loại khác: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}2 Chú thích biến lớp và phiên bảnCác chú thích loại cũng có thể được sử dụng để chú thích các biến lớp và thể hiện trong các cơ quan và phương pháp lớp. Cụ thể, ký hiệu không có giá trị path = None # type: Optional[str] # Path to module source8 cho phép người ta chú thích các biến thể hiện nên được khởi tạo trong path = None # type: Optional[str] # Path to module source9 hoặc my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.0. Cú pháp được đề xuất như sau: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}3 Ở đây my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.1 là một lớp đặc biệt được xác định bởi mô -đun gõ cho biết trình kiểm tra loại tĩnh rằng biến này không nên được đặt trên các trường hợp. Lưu ý rằng tham số my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.1 không thể bao gồm bất kỳ biến loại nào, bất kể mức độ lồng nhau: my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.3 và my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.4 đều không hợp lệ nếu my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.5 là biến loại. Điều này có thể được minh họa với một ví dụ chi tiết hơn. Trong lớp học này: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}4 my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.6 được dự định là một biến lớp (theo dõi nhiều số liệu thống kê trên mỗi trò chơi khác nhau), trong khi my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.7 là một biến thể hiện với giá trị mặc định được đặt trong lớp. Sự khác biệt này có thể không được nhìn thấy bởi một trình kiểm tra loại: cả hai đều được khởi tạo trong lớp, nhưng my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.7 chỉ đóng vai trò là giá trị mặc định thuận tiện cho biến thể hiện, trong khi my_var: int my_var = 5 # Passes type check. other_var: int = 'a' # Flagged as error by type checker, # but OK at runtime.6 thực sự là một biến lớp - nó được dự định sẽ được chia sẻ bởi tất cả các trường hợp. Vì cả hai biến xảy ra được khởi tạo ở cấp độ lớp, nên rất hữu ích khi phân biệt chúng bằng cách đánh dấu các biến lớp là chú thích với các loại được bọc trong var = value # type: annotation var: annotation; var = value var: annotation = value0. Theo cách này, một trình kiểm tra loại có thể gắn cờ các bài tập tình cờ vào các thuộc tính có cùng tên trên các trường hợp. Ví dụ, chú thích lớp đã thảo luận: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}5 Như một vấn đề thuận tiện (và quy ước), các biến thể hiện có thể được chú thích trong path = None # type: Optional[str] # Path to module source9 hoặc các phương thức khác, thay vì trong lớp: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}6 Chú thích biểu thứcMục tiêu của chú thích có thể là bất kỳ mục tiêu gán duy nhất hợp lệ nào, ít nhất là về mặt cú pháp (tùy thuộc vào kiểu kiểm tra loại phải làm gì với điều này): primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}7 Lưu ý rằng ngay cả một tên ngoặc cũng được coi là một biểu thức, không phải là một tên đơn giản: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}8 Nơi chú thích aren cho phépViệc cố gắng chú thích các biến theo var = value # type: annotation var: annotation; var = value var: annotation = value2 hoặc var = value # type: annotation var: annotation; var = value var: annotation = value3 là bất hợp pháp trong cùng một phạm vi chức năng: primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: ClassVar[Dict[str, int]] = {}9 Lý do là các biến riêng của var = value # type: annotation var: annotation; var = value var: annotation = value2 và var = value # type: annotation var: annotation; var = value var: annotation = value3 don don; Do đó, các chú thích loại thuộc về phạm vi sở hữu biến. Chỉ được phép cho phép các mục tiêu gán đơn và các giá trị bên tay phải duy nhất được cho phép. Ngoài ra, người ta không thể chú thích các biến được sử dụng trong câu lệnh var = value # type: annotation var: annotation; var = value var: annotation = value6 hoặc var = value # type: annotation var: annotation; var = value var: annotation = value7; Chúng có thể được chú thích trước thời hạn, theo cách tương tự như giải nén: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?0 Chú thích biến trong các tệp sơ khaiVì các chú thích thay đổi dễ đọc hơn các bình luận loại, chúng được ưa thích trong các tệp sơ khai cho tất cả các phiên bản của Python, bao gồm Python 2.7. Lưu ý rằng các tệp sơ khai không được thực thi bởi các phiên dịch viên Python và do đó sử dụng các chú thích thay đổi sẽ không dẫn đến lỗi. Kiểu kiểm tra loại nên hỗ trợ các chú thích thay đổi trong các cuống cho tất cả các phiên bản của Python. Ví dụ: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?1 Kiểu mã hóa ưa thích cho các chú thích thay đổiChú thích cho các biến cấp mô -đun, các biến lớp và thể hiện và các biến cục bộ phải có một không gian duy nhất sau khi đại tràng tương ứng. Không nên có không gian trước đại tràng. Nếu một nhiệm vụ có phía bên tay phải, thì dấu hiệu bình đẳng sẽ có chính xác một khoảng trống ở cả hai bên. Ví dụ:
Thay đổi đối với thư viện và tài liệu tiêu chuẩn
Hiệu ứng thời gian chạy của các chú thích loạiChú thích một biến cục bộ sẽ khiến thông dịch viên coi nó như một địa phương, ngay cả khi nó không bao giờ được chỉ định. Chú thích cho các biến cục bộ sẽ không được đánh giá: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?4 Tuy nhiên, nếu nó ở cấp độ mô -đun hoặc lớp, thì loại sẽ được đánh giá: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?5 Ngoài ra, ở cấp độ mô -đun hoặc lớp, nếu mục được chú thích là một tên đơn giản, thì nó và chú thích sẽ được lưu trữ trong thuộc tính some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value5 của mô -đun hoặc lớp đó Chú thích. Đây là một ví dụ: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?6 some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value5 có thể ghi, vì vậy điều này được cho phép: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?7 Nhưng việc cố gắng cập nhật some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value5 lên một cái gì đó không phải là ánh xạ được đặt hàng có thể dẫn đến một kiểu mẫu: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?8 . Cách khuyến nghị để nhận được các chú thích trong thời gian chạy là sử dụng hàm path = None # type: Optional[str] # Path to module source7; Như với tất cả các thuộc tính Dunder, bất kỳ việc sử dụng some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value5 nào không bị phá vỡ mà không cần cảnh báo: if some_value: my_var = function() # type: Logger else: my_var = another_function() # Why isn't there a type here?9 Lưu ý rằng nếu các chú thích không được tìm thấy thống kê, thì từ điển some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value5 hoàn toàn không được tạo ra. Ngoài ra, giá trị của việc có các chú thích có sẵn tại địa phương không bù đắp chi phí phải tạo và điền từ điển chú thích trên mỗi cuộc gọi chức năng. Do đó, các chú thích ở cấp độ chức năng không được đánh giá và không được lưu trữ. Các công dụng khác của chú thíchTrong khi Python với PEP này sẽ không phản đối: path = None # type: Optional[str] # Path to module source0 Vì nó sẽ không quan tâm đến việc chú thích loại ngoài phạm vi đánh giá mà không cần nâng cao, một trình kiểm tra loại gặp phải nó sẽ gắn cờ nó, trừ khi bị vô hiệu hóa với sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False3 hoặc sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False4. Tuy nhiên, vì Python đã giành được sự chăm sóc của loại hình này là gì, nếu đoạn trích ở trên ở cấp độ toàn cầu hoặc trong một lớp, some_number: int # variable without initial value some_list: List[int] = [] # variable with initial value5 sẽ bao gồm sane_world: bool if 2+2 == 4: sane_world = True else: sane_world = False6. Những chú thích được lưu trữ này có thể được sử dụng cho các mục đích khác, nhưng với PEP này, chúng tôi đề xuất rõ ràng gợi ý loại là việc sử dụng các chú thích ưa thích. Các đề xuất bị từ chối/hoãn lại
Khả năng tương thích ngượcPEP này hoàn toàn tương thích ngược. Thực hiệnMột triển khai cho Python 3.6 được tìm thấy trên github repo tại https://github.com/ilevkivskyi/cpython/tree/pep-526 Bản quyềnTài liệu này đã được đặt trong phạm vi công cộng. Loại gợi ý trong Python là gì?Loại gợi ý là một giải pháp chính thức để chỉ ra định nghĩa loại giá trị trong mã Python của bạn. Nó được chỉ định trong PEP 484 và được giới thiệu trong Python 3.5. Dưới đây là một ví dụ về việc thêm thông tin loại vào một chức năng.a formal solution to statically indicate the type of a value within your Python code. It was specified in PEP 484 and introduced in Python 3.5. Here's an example of adding type information to a function.
Bạn có thể chỉ định loại trong Python không?Các phiên bản gần đây của Python cho phép bạn chỉ định các gợi ý loại rõ ràng có thể được sử dụng bởi các công cụ khác nhau để giúp bạn phát triển mã của mình hiệu quả hơn. Trong hướng dẫn này, bạn sẽ tìm hiểu về những điều sau: Loại chú thích và gợi ý loại. Thêm các loại tĩnh vào mã, cả mã của bạn và mã của người khác.
__ chú thích __ trong Python là gì?Trong bài học này, bạn sẽ tìm hiểu về các chú thích trong Python. Các chú thích đã được giới thiệu trong Python 3.0 ban đầu mà không có bất kỳ mục đích cụ thể nào. Chúng chỉ đơn giản là một cách để liên kết các biểu thức tùy ý với các đối số chức năng và trả về các giá trị.a way to associate arbitrary expressions to function arguments and return values.
Python có thực thi gợi ý loại không?Gợi ý loại được thực hiện bằng cách sử dụng các chú thích Python (được giới thiệu từ PEP 3107).Chúng được sử dụng để thêm các loại vào các biến, tham số, đối số hàm cũng như các giá trị trả về, thuộc tính lớp và phương thức của chúng.Thêm gợi ý loại không có hiệu ứng thời gian chạy: Đây chỉ là những gợi ý và không được thực thi.
PEP484 là gì?PEP 484, cung cấp một đặc điểm kỹ thuật về hệ thống loại sẽ trông như thế nào trong Python3, đã đưa ra khái niệm về gợi ý loại.provides a specification about what a type system should look like in Python3, introduced the concept of type hints. |