- vừa được xem lúc

Năm 2025: Bộ công cụ Python của bạn không chỉ có mỗi PyCharm

0 0 3

Người đăng: Sunny

Theo Viblo Asia

Hệ sinh thái Python ngày càng lớn mạnh, với các công cụ mới liên tục xuất hiện. Bạn có cảm thấy hơi choáng ngợp không? Đừng lo lắng.

Bài viết này sẽ đi thẳng vào vấn đề. Chúng ta sẽ chỉ nói về các công cụ siêu hiện đại, những nhân tố thực sự thay đổi cuộc chơi cho trải nghiệm lập trình của bạn vào năm 2025.

ServBay: Tạm biệt môi trường Python rườm rà

Thành thật mà nói: cấu hình môi trường Python là cơn đau đầu lớn nhất cho người mới bắt đầu, nơi Python 2.x và 3.x có thể dễ dàng tạo ra một mớ hỗn độn. Quên người mới đi; ngay cả các lập trình viên dày dạn kinh nghiệm cũng thường xuyên vò đầu bứt tai khi phải xử lý các phiên bản Python khác nhau cho các dự án khác nhau.

Giờ đây, đã có ServBay. Hãy xem nó như một siêu hộp công cụ dành cho lập trình viên.

Với ServBay, việc cài đặt Python chỉ là vài cú nhấp chuột. Tuyệt vời hơn nữa, bạn có thể cài đặt song song nhiều phiên bản như Python 3.8, 3.10, và 3.12. Sử dụng phiên bản nào bạn cần, bất cứ khi nào bạn muốn. Chúng sẽ không "đánh nhau"; chúng chỉ cùng tồn tại một cách hòa bình.

Và đây là điểm nhấn: Bạn không cần gõ một dòng lệnh nào.

Không còn phải vật lộn với lỗi biên dịch của pyenv hay sa lầy vào việc thiết lập môi trường của miniconda. ServBay cho phép bạn tập trung vào điều thực sự quan trọng—viết mã.

Mô tả hình ảnh

Khi nói đến việc thiết lập môi trường phát triển, nếu mất hơn 5 phút, ServBay rất nhanh. Nếu dưới 5 phút, ServBay vừa tốt lại vừa nhanh. Ngoài ra, ServBay còn cung cấp các công cụ khác mà lập trình viên cần, nhưng tôi sẽ để bạn tự mình khám phá.

Ruff: Linter Nhanh Như Chớp

Mã của bạn có thường xuyên bị đồng nghiệp nhắc nhở về các vấn đề định dạng không? Ruff đến để giải cứu. Nó được viết bằng Rust, và trước khi nói về bất kỳ tính năng nào khác, chỉ cần biết một điều: nó nhanh.

Mô tả hình ảnh

Nhanh đến mức nào? Nhanh đến mức bạn có thể thiết lập định dạng khi lưu, và ngay khi bạn nhấn Ctrl+S, mã của bạn đã được sắp xếp gọn gàng đẹp mắt.

Ví dụ, đoạn mã dưới đây có ba vấn đề nhỏ: gõ sai tên biến, import không nằm ở đầu tệp, và một import không được sử dụng.

data = datas[0]
import collections

Chạy Ruff, và nó ngay lập tức cung cấp cho bạn một danh sách vấn đề rõ ràng:

$ ruff check .
ruff.py:1:8: F821 Undefined name `datas`
ruff.py:2:1: E402 Module level import not at top of file
ruff.py:2:8: F401 [*] `collections` imported but unused
Found 3 errors.
[*] 1 potentially fixable with the --fix option.

mypy: Phát hiện sự cố trước khi mã của bạn bị sập

"Ngôn ngữ động rất thú vị cho đến khi bạn phải tái cấu trúc." Câu nói này phũ phàng nhưng đúng sự thật. mypy giúp "kiểm tra sức khỏe" cho mã của bạn trước cả khi nó chạy.

Ví dụ, giả sử bạn cố gắng chia một chuỗi cho 10, điều này rõ ràng là sai.

def process(user: dict[str, str]) -> None: # mypy sẽ giơ cờ đỏ báo hiệu ở đây! user['name'] / 10 user: dict[str, str] = {'name': 'alpha'}
process(user)

Không cần chạy mã, mypy sẽ nói thẳng với bạn: "Này bạn, có gì đó không ổn ở đây!"

$ mypy --strict mypy_intermediate.py
mypy_fixed.py:2: error: Unsupported operand types for / ("str" and "int")
Found 1 error in 1 file (checked 1 source file)

Trong các dự án lớn, khả năng phát hiện sớm các vấn đề này thực sự là một cứu cánh.

Pydantic: Ngừng sử dụng Dictionary thô

Vẫn đang truyền các dictionary (dict) qua lại? Ai biết bên trong có những key nào, hay kiểu dữ liệu của chúng là gì? Pydantic cho phép bạn định nghĩa cấu trúc dữ liệu của mình một cách rõ ràng như cách bạn làm với một class Python thông thường.

Mô tả hình ảnh

Nó không chỉ về cấu trúc rõ ràng; nó còn tự động xác thực dữ liệu của bạn.

import uuid
import pydantic class User(pydantic.BaseModel): name: str id: str | None = None @pydantic.validator('id') def validate_id(cls, user_id: str) -> str | None: if user_id is None: return None try: # Kiểm tra xem ID có phải là UUID v4 hợp lệ không uuid.UUID(user_id, version=4) return user_id except ValueError: # Nếu không, trả về None return None # 'invalid' sẽ tự động được chuyển đổi thành None
users = [ User(name='omega', id='invalid') ]
print(users[0])

Thấy không? id='invalid' đã được tự động xác thực và đặt thành None. Độ bền vững của mã của bạn tăng vọt.

name='omega' id=None

Typer: Xây dựng CLI vốn dĩ phải đơn giản như vậy

Bạn muốn thêm giao diện dòng lệnh vào script của mình? Hãy quên đi những đoạn mã soạn sẵn của argparse. Với Typer, bạn chỉ cần viết một hàm Python thông thường và thêm gợi ý kiểu cho các tham số của nó.

Mô tả hình ảnh

import typer app = typer.Typer() @app.command()
def main(name: str) -> None: print(f"Hello {name}") if __name__ == "__main__": app()

Và cứ như thế, một CLI đầy đủ tính năng với tài liệu trợ giúp riêng (--help) đã ra đời. Việc chạy nó cũng đơn giản như:

$ python main.py "World"
Hello World

Rich: Làm cho Terminal của bạn trở nên sống động

Bạn đã chán ngấy với đầu ra terminal đơn điệu, đen trắng? Rich có thể làm cho terminal của bạn trở nên rực rỡ và đầy màu sắc.

Mô tả hình ảnh

from rich import print user = {'name': 'omega', 'id': 'invalid'}
# Rich có thể in cấu trúc dữ liệu một cách đẹp mắt và thậm chí hỗ trợ emoji
print(f":wave: Rich printing\nuser: {user}")

Đầu ra trông như thế này. Có phải tốt hơn nhiều so với print tiêu chuẩn không?

👋 Rich printing user: {'name': 'omega', 'id': 'invalid'}

Polars: Ác quỷ tốc độ cho dữ liệu dạng bảng

Nếu bạn đã từng xử lý một tập dữ liệu tương đối lớn với Pandas, bạn sẽ hiểu nỗi đau của việc chờ đợi. Polars là một lựa chọn mới, nhanh hơn Pandas rất nhiều trong nhiều tình huống.

import polars as pl df = pl.DataFrame({ 'date': ['2025-01-01', '2025-01-02', '2025-01-03'], 'sales': [1000, 1200, 950], 'region': ['North', 'South', 'North']
}) # Các thao tác chuỗi rõ ràng, và việc đánh giá lười (lazy evaluation) giúp tăng hiệu suất
query = ( df.lazy() .with_columns(pl.col("date").str.to_date()) .group_by("region") .agg( pl.col("sales").mean().alias("avg_sales"), pl.col("sales").count().alias("n_days"), )
) print(query.collect())

Kết quả rõ ràng, và quá trình tính toán được tối ưu hóa cao và hiệu quả.

shape: (2, 3)
┌────────┬───────────┬────────┐
│ region ┆ avg_sales ┆ n_days │
│ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ u32 │
╞════════╪═══════════╪════════╡
│ North ┆ 975.0 ┆ 2 │
│ South ┆ 1200.0 ┆ 1 │
└────────┴───────────┴────────┘

Pandera: Một thanh tra chất lượng cho dữ liệu của bạn

80% phân tích dữ liệu là làm sạch dữ liệu. Pandera hoạt động như một thanh tra chất lượng. Bạn định nghĩa một lược đồ dữ liệu (schema) trước, và bất kỳ dữ liệu không tuân thủ nào sẽ bị từ chối ngay lập tức.

import pandera as pa
from pandera.polars import DataFrameSchema, Column schema = DataFrameSchema({ "sales": Column(int, checks=[pa.Check.greater_than(0)]), "region": Column(str, checks=[pa.Check.isin(["North", "South"])]),
}) # DataFrame này có giá trị sales âm và sẽ thất bại khi xác thực
bad_data = pl.DataFrame({"sales": [-1000, 1200], "region": ["North", "South"]}) try: schema(bad_data)
except pa.errors.SchemaError as err: print(err) # Pandera sẽ cho bạn biết chính xác lỗi ở đâu

Điều này đảm bảo rằng chỉ có dữ liệu sạch mới đi vào logic cốt lõi của bạn, giúp bạn tránh khỏi vô số rắc rối sau này.

DuckDB: Tên lửa bỏ túi cho SQL phân tích

Đừng để cái tên đánh lừa bạn; nó không liên quan gì đến vịt cả. DuckDB là một cơ sở dữ liệu nhúng siêu tiện lợi. Hãy xem nó như SQLite, nhưng được thiết kế riêng cho phân tích dữ liệu. Nó có thể truy vấn trực tiếp các tệp Parquet và CSV với tốc độ đáng kinh ngạc, sử dụng cú pháp SQL tiêu chuẩn. Không cần khởi động một máy chủ cơ sở dữ liệu nặng nề để tận hưởng sức mạnh và sự tiện lợi của SQL trong các script Python của bạn. Nó thực sự là một niềm vui cho việc khám phá dữ liệu và tạo mẫu nhanh.

Mô tả hình ảnh

import duckdb
# (Giả sử sales.csv và products.parquet đã được tạo)
con = duckdb.connect() # Join trực tiếp hai tệp có định dạng khác nhau bằng SQL
result = con.execute(""" SELECT s.date, p.name, s.amount FROM 'sales.csv' s JOIN 'products.parquet' p ON s.product_id = p.product_id
""").df() print(result)

Loguru: Ghi log chưa bao giờ dễ dàng hơn

Module logging tích hợp sẵn của Python rất mạnh mẽ nhưng cấu hình có thể hơi dài dòng. Loguru đơn giản hóa mọi thứ.

Mô tả hình ảnh

from loguru import logger # Với một dòng cấu hình, log có thể được xoay vòng và nén tự động
logger.add("file.log", rotation="500 MB") logger.info("This is an info message")
logger.warning("Warning! Something happened!")

Đầu ra tự động bao gồm dấu thời gian, cấp độ và các thông tin khác, làm cho nó cực kỳ tiện lợi.

2025-01-05 10:30:00.123 | INFO | main:<module>:6 - This is an info message 2025-01-05 10:30:00.124 | WARNING | main:<module>:7 - Warning! Something happened!

Marimo: Python Notebook tương tác thế hệ mới

Jupyter rất tuyệt, nhưng nó có một số vấn đề cũ: làm lộn xộn thứ tự thực thi ô, và trạng thái có thể trở thành một mớ hỗn độn; các tệp .ipynb là một cơn ác mộng cho việc quản lý phiên bản. Marimo cố gắng giải quyết những vấn đề này. Notebook của nó là các script Python thuần túy, làm cho chúng thân thiện với Git. Thêm vào đó, nó "phản ứng"—thay đổi một biến, và tất cả các ô phụ thuộc sẽ tự động cập nhật.

Mô tả hình ảnh

Tóm lại

Vào năm 2025, nếu bạn muốn nâng tầm lập trình Python của mình, hãy thử bộ công cụ này:

  • Quản lý môi trường: Sử dụng ServBay để thiết lập chỉ với một cú nhấp chuột.
  • Chất lượng mã: Ruff + mypy cho tốc độ và sự ổn định.
  • Định nghĩa dữ liệu: Pydantic để ngừng sử dụng dữ liệu thô, không có cấu trúc.
  • Phát triển công cụ: Typer cho CLI, Rich cho đầu ra đẹp mắt.
  • Xử lý dữ liệu: Polars cho tốc độ, Pandera cho chất lượng, DuckDB cho các truy vấn linh hoạt.
  • Trợ giúp hàng ngày: Loguru để ghi log đơn giản, Marimo cho trải nghiệm notebook mới.

Hãy bắt đầu sử dụng chúng, và bạn sẽ thấy rằng việc viết Python có thể thú vị đến thế.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thao tác với File trong Python

Python cung cấp các chức năng cơ bản và phương thức cần thiết để thao tác các file. Bài viết này tôi xin giới thiệu những thao tác cơ bản nhất với file trong Python.

1 1 152

- vừa được xem lúc

Tập tành crawl dữ liệu với Scrapy Framework

Lời mở đầu. Chào mọi người, mấy hôm nay mình có tìm hiểu được 1 chút về Scrapy nên muốn viết vài dòng để xem mình đã học được những gì và làm 1 demo nho nhỏ.

1 1 251

- vừa được xem lúc

Sử dụng Misoca API (oauth2) với Python

Với bài viết này giúp chúng ta có thể nắm được. ・Tìm hiểu cách xử lý API misoca bằng Python.

1 1 135

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 3)

Tiếp tục phần 2 của series Pandas DataFrame nào. Let's go!!. Ở phần trước, các bạn đã biết được cách lấy dữ liệu một row hoặc column trong Pandas DataFame rồi phải không nào. 6 Hoc.

1 1 153

- vừa được xem lúc

Lập trình socket bằng Python

Socket là gì. Một chức năng khác của socket là giúp các tầng TCP hoặc TCP Layer định danh ứng dụng mà dữ liệu sẽ được gửi tới thông qua sự ràng buộc với một cổng port (thể hiện là một con số cụ thể), từ đó tiến hành kết nối giữa client và server.

0 0 159

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 2)

Nào, chúng ta cùng đến với phần 2 của series Pandas DataFrame. Truy xuất Labels và Data. Bạn đã biết cách khởi tạo 1 DataFrame của mình, và giờ bạn có thể truy xuất thông tin từ đó. Với Pandas, bạn có thể thực hiện các thao tác sau:.

0 0 181