Cú pháp không hợp lệ trong Python: Lý do phổ biến cho SyntaxErrorn (Phần I) (Đã dịch)

Tram Ho

Python nổi tiếng vì cú pháp đơn giản của nó. Tuy nhiên, khi bạn đang học Python lần đầu tiên hoặc khi bạn đến với Python với một nền tảng vững chắc ở ngôn ngữ lập trình khác, bạn có thể tìm hiểu những thứ mà Python không cho phép. Nếu bạn nhận được lỗi SyntaxError khi chạy code của bạn thì bài viết này sẽ giúp đỡ bạn giải quyết vấn đề này. Xuyên suốt tutorial, bạn sẽ thấy các ví dụ điển hình về lỗi cú pháp trong Python hà học cách giải quyết chúng.

Đến cuối tutorial này, bạn có thể:

  • Xác định cú pháp không hợp lệ trong Python
  • Hiểu được traceback của SyntaxError
  • Sửa và phòng tránh lỗi cú pháp

Invalid Syntax in Python

Khi bạn chạy code, đầu tiên trình biên dịch sẽ phân tích (parse) để convert nó thành Python byte code – đoạn code sau đó được chạy. Trình biên dịch sẽ tìm các lỗi về cú pháp trong bước đầu tiên trong quá trình xử lý chương trình, hay còn gọi là bước phân tích (parsing stage). Nếu trình biên dịch không thể parse đoạn code thành công thì có nghĩa là bạn đã sử dụng sai cú pháp ở đâu đó trong code của bạn. Trình biên dịch sẽ cố gắng chỉ cho bạn thấy chỗ mà lỗi đó xảy ra.

Khi bạn tiếp Python lần đầu tiên, bạn có thể bị nản khi bạn lỗi SyntaxError. Python sẽ giúp bạn xác định chỗ mà bạn sử dụng sai cú pháp nhưng traceback nó đưa ra có thể khó hiểu một chút. Thi thoảng, code nó trỏ tới hoàn toàn hợp lý.

Note: Nếu code đúng cú pháp, bạn có thể nhận được các exception khác được raise lên mà không phải là SyntaxError. Để tìm hiểu thêm về các exception khác và cách xử lý chúng, xem ở đây

Bạn không thể xử lý lỗi cú pháp như các exception khác. Thậm chí, nếu bạn cố gắng đưa đoạn code sai cú pháp vào trong một khối try...catch..., bạn vẫn sẽ trình biên dịch raise lên lỗi SyntaxError.

SyntaxError Exception and Traceback

Khi trình biên dịch gặp phải lỗi cú pháp, Python sẽ raise lên exception SybtaxErrror và cung cấp trace back với một số thông tin hữu ích để giúp bạn debug. Đây là đoạn code chứa lỗi cú pháp:

Bạn có thể thấy cú pháp không hợp lệ ở trong dict dòng 4. Mục thứ hai, 'jim', thiếu dấu phẩy. Nếu bạn chạy đoạn code, bạn sẽ thu được traceback sau:

Chú ý rằng traceback sẽ chỉ ra lỗi ở dòng 5, chứ không phải 4. Trình biên dịch Python đã cố chỉ ra vị trí lỗi. Tuy nhiên, nó chỉ có thể trỏ tới nơi nó bắt được lỗi đầu tiên. Khi nhận được traceback và traceback trông có ý nghĩa, bạn cần nhìn loại đoạn code để xác định chỗ sai.

Trong ví dụ bên trên, không có với đề với việc thiếu dấu phẩy mà phụ thuộc vào việc cái gì theo sau nó. Ví dụ, việc không có dấu phẩy sau 'michael' ở dòng 5 chẳng ảnh hưởng gì. Nhưng một khi trình biên dịch bắt gặp điều gì đó bất ổn, nó chỉ có thể trỏ ngay tới dòng code đầu tiên mà nó không hiểu.

Note: Tutorial này giả định rằng bạn đã có kiến thức cơ bản về traceback trong Python. Để tìm hiểu thêm về traceback và cách đọc hiểu chúng, đọc bài viết này.

Có một vài thành phần của SyntaxError có thể giúp bạn xác định vị trí lỗi:

  • File name – file mà lỗi cú pháp được tìm thấy
  • Line number – nội dung dòng lỗi
  • Caret – vị trí chính xác mà lỗi được bắt gặp
  • Error message – xuất hiện ngay sau kiểu lỗi SybtaxError, nội dung lỗi giúp bạn xác định vấn đề

Trong ví dụ trên, file name là theofficefacts.py, line number là 5 và caret trỏ vào dấu nháy đơn của key michael. Traceback SyntaxError có thể không chỉ ra vấn đề thực sự nhưng nó sẽ chỉ tới vị trí đầu tiên mà trình biên dịch không hiểu.

Có hai exception khác bạn có thể sẽ thấy Python raise lên. Nó tương tự như SyntaxError nhưng dưới những cái tên khác:

  1. IndentationError
  2. TabError

Những exception này đều kế thừa từ SyntaxError nhưng chúng là những trường hợp đặc biệt liên quan đến indentation (thụt đầu dòng). IndentationError được raise lên khi các mức indent không khớp nhau. Còn TabError xuất hiện khi code của bạn sử dụng cả tab và space reong cùng một file. Chúng ta sẽ xét kỹ hơn đến những exception này trong phần sau.

Common Syntax Problems

Khi chúng ta bắt gặp SyntaxError lần đầu tiền, việc biết lý do lỗi xảy ra và cách fix nó thực sự hữu ích. Trong các phần tiếp theo, chúng ta sẽ thấy một số lý do phổ biến mà SyntaxError có thể được raise lên và cách bạn có thể fix chúng.

Misusing the Assignment Operator (=)

Nguồn: https://realpython.com/invalid-syntax-python/

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo