Hướng dẫn syntax errors in python
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 Đến cuối tutorial này, bạn có thể:
Invalid Syntax in PythonKhi 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
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 SyntaxError Exception and TracebackKhi trình biên dịch gặp phải lỗi cú pháp, Python sẽ raise lên exception
Bạn có thể thấy cú pháp không hợp lệ ở trong dict dòng 4. Mục thứ hai,
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
Có một vài thành phần của
Trong ví dụ trên, file name là Có hai exception khác bạn có thể sẽ thấy Python raise lên. Nó tương tự như
Những exception này đều kế thừa từ Common Syntax ProblemsKhi chúng ta bắt gặp Misusing the Assignment Operator (=)Có vài trường hợp trong Python mà bạn không để gán các object ví dụ như với chuỗi và lời gọi hàm:
Ví dụ đầu tiên cố gắng gán giá trị Ví dụ thứ hai và thứ ba cố gắng gái một string với một số nguyên cho các chuỗi. Quy tắc tương tự đúng với các giá trị chuỗi khác. Một lần nữa, traceback chỉ ra vấn đề xảy ra khi bạn cố gắng gán một giá trị cho một chuỗi.
Có lẽ là bạn sẽ chẳng bao giờ có ý định gán một giá trị cho một chuỗi hoặc lời gọi hàm. Các lỗi trên xảy ra chỉ khi bạn vô tình quên mất một dấu "=" khi bạn muốn thực hiện phép so sánh:
Đa số các trường hợp, khi Python nói rằng bạn đang thực hiện phép gán với một object mà không thể được gán, đầu tiên bạn nên kiểm tra chắc chắn rằng xem câu lệnh là một lệnh gán hay là một biểu thức Boolean. Bạn cũng có thể gặp vấn đề này khi bạn đang cố gắng gán một giá trị với các keyword. Chúng ta sẽ đề cập đến trường hợp này trong mục sau. Misspelling, Missing, or Misusing Python KeywordsCác keyword trong Python là một tập các protected word có ý nghĩa đặc biệt trong Python. Đây là những từ khóa bạn không thể sử dụng như là các định danh, biến hoặc tên hàm. Chúng là một phần của ngôn ngữ và chỉ có thể sử dụng trong ngữ cảnh mà Python cho phép. Những trường hợp mà bạn có thể nhầm lẫn sử dụng các keyword:
Nếu bạn viết sai chính tả, bạn sẽ thấy lỗi
Message là Một vấn đề phổ biến khác chính là việc bạn quên keyword:
Một lần nữa, message lại không
hữu ích nhưng traceback lại trỏ tới đúng vị trí. Nếu bạn di chuyển dấu mũ ngược lại bạn sẽ đấy keyword Bạn cũng có thể sử dụng sai protected keyword. Hãy nhớ rằng, các keyword chỉ được sử dụng trong một số trường hợp nhất định. Nếu bạn sử dụng sai chúng bạn cũng sẽ nhận được lỗi sai cú pháp. Một ví dụ điển hình là việc sử dụng
Ở đây, Python đã làm tốt việc thông báo chính xác lỗi cho bạn biết. Message " Một ví dụ khác là nếu bạn cố gắng gán một keyword cho một biến hoặc sử dụng keyword để khai báo hàm:
Nếu bạn thử gắn một giá trị cho Giải quyết lỗi cú pháp này có thể khó hơn một chút bởi đoạn
code nhìn bên ngoài trông thì khá ổn. Nếu code trông ổn mà bạn vẫn gặp lỗi Danh sách các protected keyword sẽ thay đổi theo phiên bản của Python. Ví dụ trong Python 3.6 bạn có thể sử dụng Một ví dụ khác của vấn đề này chính là
Bạn có thể chạy code sau để thấy một danh sách keyword trong phiên bản Python mà bạn sử dụng:
Missing Parentheses, Brackets, and QuotesThông thường, nguyên nhân gây ra lỗi cú pháp trong Python là do thiếu dấu đơn, ngoặc vuông hoặc dấu nháy đơn/kép đóng. Những thiếu xót này khó phát hiện ra ở những dòng dài mà có nhiều dấu ngoặc đơn lồng nhau hoặc ở những khối code nhiều dòng. Bạn có thể phát hiện ra điều này nhờ sự giúp đỡ của traceback:
Ở đây, traceback chỉ ra chỗ code không hợp lệ là ở vị trí
Một sai lầm thường gặp khác là quên đóng string:
Lần này, dầu mũ trong traceback trỏ chính xác tới vị trí code có vấn đề. Thông báo Việc thiếu dấu nháy trong các statement thuộc một f-string có thể dẫn tới lỗi cú pháp:
Ở đây, việc tham chiếu tới dict
Python xác định vấn đề và cho bạn biết vấn đề nằm ở trong f-string. Message "unterminated string" cũng chỉ ra vấn đề là gì. Dấu mũ trong trường hợp này chỉ trỏ tới vị trí bắt đầu của f-string. Việc này có thể không có ý nghĩa khi mà dấu mũ trỏ tới khu vực của f-string nhưng nó lại không thu hẹp vị trí mà chúng ta cần quan tâm. Có một string chưa kết thúc bên trong f-string. Bạn chỉ việc tìm ra nó. Để fix lỗi này, hãy đảm bảo rằng tất cả các dấu nháy trong f-string và ngoặc nhọn phải đầy đủ. Lỗi tương tự xảy ra khi thiếu ngoặc đơn và ngoặc vuông. Ví dụ, nếu bạn quên dấu ngoặc vuông dùng để đóng một list, Python sẽ phát hiện và trỏ tới đó. Tuy nhiên, không có nhiều sự khác biệt trong những trường hợp này. Trong ví dụ đầu tiên, chúng ta quên dấu ngoặc vuông đóng:
Khi chạy đoạn code này, bạn sẽ được nhắc nhở rằng có lỗi khi gọi
Điều xảy ra ở đây chính là việc Python nghĩ là list gồm ba phần tử: Một biến thể nữa là thêm một dấu phẩy sau phần tử cuối cùng của list trong khi vẫn quên dấu ngoặc vuông đóng:
Bây giờ bạn nhận được một traceback khác:
Trong ví dụ trước đó, Trong ví dụ này, Python mong chờ một dấu ngoặc vuông đóng Mistaking Dictionary SyntaxTrước đó bạn đã thấy rằng bạn có thể gặp lỗi
Một lần nữa thông báo lỗi lại không hữu ích. Tuy nhiên, dòng nhắc lại và dấu mũ lại rất hữu ích! Chúng trỏ tới đúng ký tự có vấn đề. Để fix lỗi này, bạn có thể thay thế các dấu "=" với dấu ":". Bạn cũng có thể chuyển sang dùng
Bạn có thể sử dụng Using the Wrong IndentationCó hai class con của
Trong khi các ngôn ngữ lập trình khác sử ngoặc nhọn để khai báo một khối code, Python lại sử dụng
Điều này có thể khá khó để phát hiện nhưng dòng thứ 5 chỉ bị thụt có hai khoảng trắng. May thay Python lại dễ dàng phát hiện và nói cho bạn biết vấn đề là gì:
Mặc dù traceback trông khá giống traceback của Một loại Nếu tab size trùng với số khoảng trắng trong mỗi mực indentation thì mọi thứ chẳng có vẻ gì lạ. Tuy nhiên, nếu một dòng được indent bằng space và một dòng khác lại được indent với tab thì Python sẽ chỉ cho bạn thấy vấn đề:
Ở đây, dòng 5 được indent với một ký tự tab gồm 4 space. Khối code này có thể nhìn có vẻ hoàn hảo hoặc hoàn toàn sai, tùy vào setting hệ thống của bạn. Tuy nhiên, Python sẽ để ý vấn đề này ngay lập tức. Nhưng trước khi bạn chạy đoạn code để xem Python sẽ nói cho bạn biết cái gì sai, hãy xem ví dụ sau:
Chú ý là sự khác biệt trong hiển thị giữa ba ví dụ trên. Trừ dòng 5 sử dụng single tab thì các dòng code khác sử dụng 4 space cho một mức indentation. Độ rộng của tab thay đổi dựa vào tab width setting:
Khi bạn chạy đoạn code, bạn sẽ nhận được lỗi và traceback sau:
Chú ý rằng ở đây
ta nhận được Giải pháp cho vấn đề này là sử dụng hoặc là tab hoặc là space cho indentation, chứ không phải là cả hai. Defining and Calling FunctionsBạn có thể gặp lỗi cú pháp khi bạn định nghĩa hoặc gọi hàm. Ví dụ, bạn sẽ thấy SyntaxError nếu bạn sử dụng ";" thay vì ":" ở cuối cuối nghĩa hàm:
Traceback ở đây rất hữu ích với việc dấu mũ trỏ tới đúng ký tự gây ra lỗi. Bạn có thể xóa xổ lỗi này bằng cách chuyển sang sử dụng ":". Hơn nữa, các keyword argument trong định nghĩa hàm và gọi hàm cũng cần phải đúng vị trí. Keyword argument luôn đến sau các positional argument:
Ở đây, một lần nữa, tin nhắn lỗi lại rất hữu ích khi nói chỉ rõ cho bạn thấy vị trí lỗi. Changing Python VersionsThi thoảng, code chạy tốt ở một phiên bản Python nhưng
lại bị lỗi ở các version mới hơn. Điều này là vì những thay đổi trong cú pháp ngôn ngữ. Ví dụ điển hình nhất chính là lệnh
Đây là một trong các ví dụ mà tin nhắn lỗi cho Một vấn đề khác bạn có thể gặp chính là khi bạn đọc hoặc học về các cú pháp hợp lệ trong phiên bản mới hơn nhưng lại không hợp lệ trong phiên bản mà bạn đang dùng. Một ví dụ của việc này chính là cú pháp f-string - nó chỉ tồn tại trong các phiên bản từ 3.7 trở về sau:
Trong các phiên bản Python trước 3.6, trình biên dịch không hề hiểu gì về f-string và sẽ chỉ đưa ra một thông báo chung chung là "invalid syntax". Trong trường hợp này, vấn đề là code trông thì rất ổn nhưng nó lại được chạy với Python phiên bản cũ. Cú pháp Python đang tiếp tục thay đổi, do đó sẽ có những tính năng mới được giới thiệu trong Python 3.8:
Nếu bạn muốn thử các tính năng mới này thì bạn hãy chắc chắn rằng mình sử dụng môi trường Python 3.8. Nếu không thì bạn sẽ gặp lỗi Python 3.8 cũng cung cấp
Trong Python 3.8, đoạn
code này sẽ vẫn raise lên lỗi
Lời nhắn kèm theo ConclusionTrong tutorial này, bạn đã thấy được các thông tin mà traceback của Khi viết code, bạn thử sử dụng một IDE hỗ trợ việc soát lỗi và cung cấp feedback hữu ích. Nếu bạn đưa những đoạn code này vào một trình IDE tốt, nó sẽ highlight các lỗi cú pháp cho bạn thấy. Việc gặp lỗi cú pháp Nguồn: https://realpython.com/invalid-syntax-python/ |