Python có thể được gõ tĩnh không?

Ngôn ngữ lập trình có thể được phân loại thành hai loại Dynamic typing và static typing. Python là một ngôn ngữ được gõ động. Điều này có nghĩa là trình thông dịch Python chỉ kiểm tra kiểu khi mã chạy. Tuy nhiên, trong ngôn ngữ kiểu tĩnh, việc kiểm tra các biến/đối tượng

được thực hiện tại thời điểm biên dịch. Vì vậy, việc xử lý hoặc sửa lỗi trở nên dễ dàng nếu bạn có thể tìm thấy chúng trước khi chạy chương trình

Khi bạn viết chương trình bằng ngôn ngữ gõ động, không bắt buộc phải xác định loại biến. Nó có nguồn gốc dựa trên các giá trị bạn gán cho chúng. Nhưng việc duy trì mã ngày càng khó hơn vì nó tạo ra sự nhầm lẫn và mất nhiều thời gian hơn để hiểu mã

Một số ví dụ về ngôn ngữ gõ động là

  • con trăn
  • PHP
  • JavaScript

Một số ví dụ về ngôn ngữ gõ tĩnh là

  • Java
  • C
  • C++

Ví dụ

Hãy tạo một biến trong python và xem nó có thể thay đổi kiểu như thế nào

con trăn

Java. Bạn có thể thấy trong trường hợp java bạn không thể gán một loại giá trị khác với loại biến

Python sẽ luôn. Tuy nhiên, PEP 484 đã giới thiệu các gợi ý về kiểu, cho phép thực hiện kiểm tra kiểu tĩnh của mã Python

Tuy nhiên, không giống như ngôn ngữ kiểu tĩnh, chỉ xác định gợi ý kiểu trong mã python không thực thi kiểu. Chúng tôi có một số công cụ để thực hiện các kiểm tra này như mypy

Trong ví dụ sau, chúng ta có hai hàm, một hàm không có gợi ý kiểu và một hàm có gợi ý kiểu. Khi chúng tôi chạy chương trình, nó chỉ hoạt động và không phàn nàn vì chúng tôi đang chuyển các giá trị chuỗi thay vì các kiểu int được xác định cho hàm thứ hai

Nhưng hãy nghĩ xem nếu hàm hello_world_with_type_hint thực hiện phép chia cho tham số được truyền, Trong trường hợp đó, nó sẽ thông qua ngoại lệ

Sẽ thật tuyệt nếu chúng ta có một số kiểu kiểm tra trước khi thực thi mã để chúng ta có thể sửa nó phải không?

Vì vậy, ở đây đến mypy. Nó sẽ giúp chúng tôi thực hiện kiểm tra loại nếu chúng tôi có gợi ý loại được xác định trong mã

Bạn có thể cài đặt mypy bằng pip

Bây giờ hãy thực hiện kiểm tra kiểu với mypy

Bạn có thể thấy rằng nó hiển thị lỗi cho kiểu trả về và kiểu đối số

Hãy thay đổi kiểu trả về thành float theo lời khuyên của mypy

Bây giờ hãy gọi hàm với kiểu đối số hợp lệ [ int]. Bạn có thể thấy thông báo thành công ngay bây giờ

Bạn đã thấy cách mypy giúp chúng tôi tìm ra vấn đề trước khi thực sự chạy chương trình. Nó cũng đề xuất các tùy chọn chính xác

Nhưng chúng tôi không cần chạy mypy cho từng tệp mã của mình. Tuy nhiên chúng ta có thể cấu hình mypy với pre-commit để nó thực thi bất cứ khi nào bạn muốn commit code

Phần kết luận

Chúng tôi đã thấy một ví dụ về một trong những lợi thế của việc thêm các loại vào mã của bạn. gõ gợi ý giúp bắt lỗi nhất định. Nó cũng giúp ghi lại mã của bạn

Khi chuyển trình nhập dữ liệu của Nominatim sang Python vào năm ngoái, chất lượng mã đóng một vai trò quan trọng. Có các bài kiểm tra đơn vị cho mọi chức năng và một công cụ linting chạy thường xuyên như một phần của quá trình tích hợp liên tục để tìm ra mã nhỏ có mùi là dấu hiệu đầu tiên của các vấn đề lớn hơn với mã. Bây giờ chúng tôi đã thêm một mức kiểm tra chất lượng bổ sung. kiểm tra kiểu tĩnh

Python là một ngôn ngữ lập trình kiểu động. Các biến trong Python có kiểu nhưng chúng ẩn và có thể thay đổi bằng một phép gán đơn giản. Điều này mang lại cho Python mức độ linh hoạt cao và khiến nó trở nên hữu ích như một ngôn ngữ tạo mẫu nhanh. Vấn đề là khi cơ sở mã phát triển, nó cũng có thể cản trở việc lập trình hiệu quả. Bất cứ khi nào bạn định nghĩa một hàm, bạn thường đưa ra các giả định ngầm định về loại tham số và giá trị trả về. Giả sử, hàm của bạn lấy ID của nút OSM làm tham số. Vì bạn biết đó là một số, bạn có thể mong đợi rằng ID có loại int vì nó sẽ không hiệu quả nếu chính hàm đó cố gắng chuyển đổi tham số đầu vào thành một số mỗi lần. Những loại giả định này được thực hiện tất cả các thời gian. Khi cơ sở mã phát triển, việc ghi nhớ những giả định này trở nên khó khăn hơn. Kết quả là bạn cần tiếp tục đọc lại mã của chính mình để nhớ những gì bạn đã làm. Điều này là tẻ nhạt và dễ bị lỗi

Để giải quyết vấn đề, Python đã đưa ra khái niệm về chú thích kiểu, Chúng cho phép lập trình viên thêm các gợi ý về kiểu dự kiến ​​của một tham số, biến hoặc tham số trả về của hàm. Các chú thích này không tạo ra ngôn ngữ được nhập tĩnh từ Python. Trên thực tế, các chú thích hoàn toàn bị bỏ qua khi chạy. Thay vào đó, chúng có thể được sử dụng với các trình kiểm tra kiểu tĩnh như mypy. Họ phân tích mã mà không thực thi mã và đánh dấu những vị trí sử dụng hàm mà không có kiểu dự kiến. Điều này giúp ích rất nhiều cho chất lượng mã. Tuy nhiên, lợi ích lớn hơn nhiều của các chú thích đối với trình duy trì mã là giá trị tài liệu của chúng. Không còn phải đoán xem một hàm có thể trả về giá trị None hay không. Các chú thích đánh vần nó ra

Trong vài tuần qua, tôi đã xem qua mã Python trong Nominatim và các tham số được chú thích cũng như giá trị trả về của từng hàm đơn lẻ. Đây không phải là một công việc nhỏ. Hiện tại, mã này đã phát triển tới hơn 500 chức năng. Một số trong số chúng được chú thích nhanh chóng nhưng những cái khác gây đau đầu thực sự. Đây là những bài học quan trọng nhất mà tôi học được

Sự cám dỗ của các kiểu dữ liệu Python

Python đi kèm với một tập hợp các kiểu dữ liệu cơ bản. bộ dữ liệu, danh sách, từ điển, bộ. Chúng rất đơn giản để hiểu và khi kết hợp với nhau sẽ cung cấp một cách thuận tiện để nhanh chóng xây dựng các cấu trúc dữ liệu phức tạp. Có một số chỗ trong Nominatim mà tôi đã lười biếng và sử dụng các kiểu dữ liệu lồng nhau như vậy thay vì xác định một lớp dữ liệu phù hợp. Đây hóa ra là một rào cản lớn đối với các chú thích loại. Kỹ thuật đảo ngược các cấu trúc từ mã tốn nhiều thời gian và kết quả là các chú thích khó đọc. Ngoài ra, các chú thích có giá trị tài liệu hạn chế. Thật tuyệt khi biết rằng một hàm trả về một Tuple[List[Tuple[int, str]], str, Optional[str]]. Trình kiểm tra loại thậm chí có thể suy luận nếu chức năng được sử dụng đúng cách. Nhưng lập trình viên không phải là người khôn ngoan hơn tất cả những danh sách và chuỗi này trong giá trị trả về có thể chứa gì và phải quay lại đọc mã

Các chú thích loại đã xác định chính xác các phần có một số công việc phải làm trong tương lai. Loại bỏ các cấu trúc dữ liệu lồng nhau sẽ làm cho mã dễ hiểu hơn đối với những người bảo trì và cộng tác viên trong tương lai

Cuộc chiến của những người kiểm tra mã

Một trong những mối nguy hiểm khi có nhiều trình kiểm tra mã khác nhau là họ không đồng ý về cách mọi thứ được thực hiện. Điều này thường ít gặp vấn đề hơn với Python vì nó đi kèm với rất nhiều quy tắc mã hóa chính thức. Nếu bạn làm theo các đề xuất, thì hầu hết các trình kiểm tra mã sẽ hoạt động ngay lập tức. Loại chú thích dường như là một chút ngoại lệ. Chúng đi kèm với các đề xuất chính thức về cách sử dụng chúng trong mã nhưng kiểu được đề xuất đủ khác so với mã thông thường, công cụ linting của chúng tôi thường không đồng ý với yêu cầu của mypy. Cuối cùng, đó là một câu hỏi chứa các trường hợp có vấn đề. Một mô-đun mới nominatim.typing đảm nhận phần lớn việc đó

Làm việc với các thư viện bên ngoài

Có lẽ phần phức tạp nhất của chú thích kiểu là nơi các thư viện bên ngoài có liên quan. Mặc dù hiện tại thư viện chuẩn của Python đã được chú thích rõ ràng, nhưng có rất ít thông tin đánh máy có sẵn cho các thư viện khác mà Nominatim sử dụng. Về lý thuyết, đây không phải là vấn đề vì mypy có thể hoạt động với hỗn hợp mã được nhập động và tĩnh. Trong thực tế, việc chuyển đổi từ các chức năng thư viện không được chú thích sang mã được nhập tĩnh của chúng tôi đôi khi yêu cầu truyền khá xấu. Không hữu ích cho mục tiêu tạo mã dễ đọc. Trong trường hợp của thư viện psycopg2, việc gửi các chú thích loại để đánh máy trở nên dễ dàng hơn so với việc xả rác Nominatim bằng các diễn viên. PR đã được xem xét, hợp nhất và xuất bản trong vài ngày. Đó là tinh thần của mã nguồn mở

Python là loại tĩnh hay động?

Python là một ngôn ngữ được nhập động . 00. 12 Trình thông dịch Python chỉ kiểm tra kiểu khi mã chạy. Khi bạn thực thi một dòng mã, như bạn sẽ thấy trong ví dụ tiếp theo, đó là lúc việc kiểm tra kiểu diễn ra. 00. 23 Ngoài ra, loại biến được phép thay đổi trong suốt thời gian tồn tại của nó.

Ngôn ngữ nào được gõ tĩnh?

Ngôn ngữ được nhập tĩnh là ngôn ngữ [chẳng hạn như Java, C hoặc C++] trong đó các loại biến được biết tại thời điểm biên dịch. Trong hầu hết các ngôn ngữ này, các loại phải được chỉ định rõ ràng bởi người lập trình; .

Tại sao ngôn ngữ Python được gõ động?

Python không có vấn đề gì ngay cả khi chúng ta không khai báo kiểu biến. Nó cho biết loại biến trong thời gian chạy của chương trình. Python cũng quan tâm đến việc quản lý bộ nhớ, điều rất quan trọng trong lập trình. Vì vậy, Python là một ngôn ngữ được gõ động

Tại sao Python là ngôn ngữ gõ mạnh?

Python được gõ mạnh vì trình thông dịch theo dõi tất cả các loại biến . Nó cũng rất năng động vì nó hiếm khi sử dụng những gì nó biết để hạn chế sử dụng biến. Trong Python, trách nhiệm của chương trình là sử dụng các hàm dựng sẵn như isinstance[] và issubclass[] để kiểm tra các loại biến và cách sử dụng chính xác.

Chủ Đề