Gõ tĩnh Python

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ố. Như bạn đã biết đó là một số, bạn có thể mong đợi rằng ID có loại int bởi 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 được gõ động hay gõ tĩnh?

Python là cả ngôn ngữ được gõ mạnh và được gõ động . Gõ mạnh có nghĩa là các biến có một loại và loại đó quan trọng khi thực hiện các thao tác trên một biến. Nhập động có nghĩa là loại biến chỉ được xác định trong thời gian chạy.

Tại sao Python không được gõ tĩnh?

Python là ngôn ngữ được nhập động . Người ta không cần phải chỉ ra rõ ràng kiểu dữ liệu và kiểu trả về của các biến và hàm của bạn, tương ứng. Dynamic typing làm cho Python rất thân thiện với người dùng.

Python có hệ thống kiểu tĩnh không?

Python là ngôn ngữ được nhập động thay vì được nhập tĩnh . Điều này có nghĩa là trình thông dịch Python không nhất thiết phải biết loại đối tượng trước khi thực thi mã thực tế.

Gõ tĩnh so với gõ động là gì?

Đầu tiên, các ngôn ngữ được nhập động thực hiện kiểm tra kiểu khi chạy, trong khi các ngôn ngữ được nhập tĩnh thực hiện kiểm tra kiểu tại thời điểm biên dịch .

Chủ Đề