HomeLập trìnhPythonCách tìm nhanh...

Cách tìm nhanh các vấn đề về loại trong mã Python của bạn bằng Pytype


TL; DR — Nếu bạn đang làm việc trên một dự án Python lớn hoặc chỉ muốn giữ cho cơ sở mã của mình ngăn nắp và gọn gàng, thì Pytype chính là công cụ dành cho bạn.

Python là một ngôn ngữ lập trình tuyệt vời để tạo mẫu và viết kịch bản. Cú pháp ngắn gọn, hệ thống kiểu linh hoạt và bản chất diễn giải cho phép chúng tôi nhanh chóng thử một ý tưởng, điều chỉnh ý tưởng đó và thử lại.

Khi các dự án Python lớn lên, tính linh hoạt từng là yếu tố thúc đẩy tốc độ trở thành gánh nặng đối với tốc độ phát triển. Khi các nhà phát triển bổ sung tham gia dự án và nhiều mã hơn được viết, việc thiếu thông tin về loại sẽ khiến việc đọc và hiểu mã trở nên khó khăn hơn. Không có hệ thống kiểm tra loại, rất dễ mắc lỗi và khó phát hiện.

con trăn
CC BY 2.5, https://commons.wikimedia.org/w/index.php?curid=648709

kiểu chữ để giải cứu! Pytype là một công cụ mã nguồn mở để kiểm tra kiểu và suy luận kiểu trong Python. Và nó hoạt động vượt trội — chỉ cần cài đặt và chạy!

Pytype sẽ…

  1. Suy luận tĩnh thông tin loại và kiểm tra mã của bạn để tìm lỗi loại.
  2. Xác thực các chú thích loại PEP 484 trong mã của bạn để đảm bảo tính nhất quán.
  3. Hợp nhất lại thông tin loại suy luận vào mã của bạn, nếu bạn muốn.
Đọc thêm  Cách tạo máy chủ Django chạy uWSGI, NGINX và PostgreSQL trên AWS EC2 với Python 3.6

Nếu bạn đã bán, hãy tiếp tục truy cập Pytype để biết hướng dẫn cài đặt và sử dụng. Dưới đây tôi trình bày một số ví dụ sử dụng thú vị!

Ví dụ #1: Nhập suy luận và kiểm tra

Đây là kịch bản phổ biến nhất. Bạn đã viết một số mã và muốn kiểm tra xem bạn có mắc lỗi nào không. Hãy xem xét chức năng này:

import re

def GetUsername(email_address):
  match = re.match(r'([^@]+)@example\.com', email_address)
  return match.group(1)

Khá đơn giản. Nó trích xuất một phần của địa chỉ email trước @ bằng cách sử dụng biểu thức chính quy và trả về nó. Bạn có nhận thấy lỗi không?

Hãy xem điều gì sẽ xảy ra khi chúng ta sử dụng pytype để kiểm tra nó:

% pytype get_username.py
Analyzing 1 sources with 0 dependencies
File "/.../get_username.py", 
line 5, in GetUsername: No attribute 'group' on None [attribute-error]
  In Optional[Match[str]]

Pytype cho chúng ta biết rằng group không phải là một cuộc gọi chức năng hợp lệ trên match. Ồ! re.match() lợi nhuận None khi không tìm thấy kết quả phù hợp. Thật vậy, trong những trường hợp này match.group(1) sẽ ném một ngoại lệ.

Hãy sửa lỗi bằng cách để hàm trả về Không có cho địa chỉ email không hợp lệ:

import re
def GetUsername(email_address):
  match = re.match(r'([^@]+)@example\.com', email_address)
  
if match is None:
    return None
  return match.group(1)  # <-- Here, match can't be None

Bây giờ, khi chúng ta chạy lại pytype, lỗi đã biến mất. Pytype suy ra rằng nếu mã sau nếu được thực hiện, trận đấu được đảm bảo không được None.

Ví dụ #2: Xác thực các chú thích loại

Trong Python 3, bạn có thể chú thích kiểu (PEP 484) mã của mình để trợ giúp các công cụ kiểm tra kiểu và các nhà phát triển khác hiểu ý định của bạn. Pytype có thể cảnh báo khi chú thích loại của bạn có lỗi:

import re
from typing import Match

def GetEmailMatch(email) -> Match:
  return re.match(r'([^@]+)@example\.com', email)

Hãy sử dụng pytype để kiểm tra đoạn mã này:

% pytype example.py
Analyzing 1 sources with 0 dependencies
File "/.../example.py", line 5, in GetEmailMatch: 
bad option in return type [bad-return-type]
  Expected: Match
  Actually returned: None

Pytype đang nói với chúng ta rằng GetEmailMatch có thể trở lại Nonenhưng chúng tôi đã chú thích kiểu trả về của nó là Match. Để khắc phục điều này, chúng ta có thể sử dụng Optional gõ chú thích từ mô-đun gõ:

import re
from typing import Match, Optional

def GetEmailMatch(email) -> Optional[Match]:
  return re.match(r'([^@]+)@example\.com', email)

Optional có nghĩa là giá trị trả về có thể là một Match đối tượng hoặc None.

Ví dụ #3: Hợp nhất lại thông tin loại được suy luận

Để giúp bạn áp dụng các chú thích loại, Pytype có thể thêm chúng vào mã cho bạn. Hãy xem đoạn mã này:

import re
  
def GetEmailMatch(email):
  return re.match(r'([^@]+)@example\.com', email)

def GetUsername(email_address):
  match = GetEmailMatch(email_address)
  if match is None:
    return None
  return match.group(1)

Để thêm chú thích loại vào mã này, trước tiên chúng tôi chạy pytype trên tập tin. pytype lưu thông tin loại được suy luận vào một .pyi tập tin. Sau đó, chúng ta có thể chạy merge-pyi để hợp nhất các chú thích loại trở lại vào mã:

% pytype email.py
% merge-pyi -i email.py pytype_output/email.pyi

Và Voila!

import re
from typing import Match
from typing import Optional

def GetEmailMatch(email) -> Optional[Match[str]]:
  return re.match(r'([^@]+)@example\.com', email)

def GetUsername(email_address) -> Optional[str]:
  match = GetEmailMatch(email_address)
  if match is None:
    return None
  return match.group(1)

Các chú thích loại, bao gồm import các câu lệnh, hiện có trong tệp nguồn.

Đọc thêm  Python Find in List – Cách tìm chỉ mục của một mục hoặc phần tử trong danh sách

Để biết thêm các ví dụ sử dụng và hướng dẫn cài đặt, vui lòng truy cập Pytype trên GitHub.

Cảm ơn vì đã đọc!



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status