Python AST để viết mã
Yêu cầu. Tất cả các ví dụ đều tương thích với ít nhất Python v3. 6, ngoại trừ việc sử dụng 3 với thuộc tính 4 đã được thêm vào trong Python v3. 9 Show
Cây cú pháp trừu tượng (AST) là gì?Cây cú pháp trừu tượng (AST) là cấu trúc dữ liệu được sử dụng để suy luận về ngữ pháp của ngôn ngữ lập trình trong ngữ cảnh của các hướng dẫn được cung cấp trong mã nguồn Chẳng hạn, trình biên dịch sử dụng AST khi chuyển đổi mã nguồn thành mã nhị phân
Bất chấp vai trò của chúng đối với trình biên dịch, AST vẫn hữu ích cho nhiều trường hợp sử dụng hơn. Hãy thảo luận về điều này chi tiết hơn Mô-đun Python Module( body=[ Assign( targets=[ Name(id='one_plus_two', ctx=Store())], value=BinOp( left=Constant(value=1), op=Add(), right=Constant(value=2)))], type_ignores=[]) 7 và cách sử dụng nóMô-đun 7 trong thư viện chuẩn Python có thể được sử dụng để tạo, truy cập và sửa đổi AST liên quan đến mã nguồn Python. Nó đã được giới thiệu vào năm 1990 và kể từ đó nó đã phát triển cùng với ngữ pháp PythonNgay cả khi nó là một phần của thư viện tiêu chuẩn trong một thời gian dài, việc sử dụng nó trực tiếp không phổ biến. Thay vào đó, bạn có thể đã sử dụng nó một cách gián tiếp vì các công cụ phổ biến sử dụng nó một cách bí mật
Sử dụng mô-đun Module( body=[ Assign( targets=[ Name(id='one_plus_two', ctx=Store())], value=BinOp( left=Constant(value=1), op=Add(), right=Constant(value=2)))], type_ignores=[]) 7 để khám phá các bài tập PyBites BiteVẫn không thuyết phục về sự liên quan của một AST? . hãy xem xét một trường hợp sử dụng thực tế hơn và gần gũi hơn với Nền tảng PyBites Nền tảng PyBites hiện đang cung cấp hơn 300 bài tập Bite và con số này không ngừng tăng lên. Do mục đích (bán) ẩn của nền tảng là đưa ra một loạt các thử thách bao gồm các mô-đun và chức năng Python khác nhau, việc xác định nội dung của các bài tập đã có sẽ bắt đầu trở nên khó khăn hơn và thay vào đó, nội dung nào còn lại để khám phá Đây là nơi chúng ta có thể tận dụng mô-đun 7. Cụ thể, chúng tôi có thể xử lý mã nguồn của lời giải của các bài tập (do tác giả của các thử thách cung cấp) và khôi phục một số thống kê về nội dung của chúng. Chẳng hạn, các mô-đun phổ biến và các hàm dựng sẵn được sử dụngĐây là một số kết quả. Để theo dõi, hãy xem sổ ghi chép Jupyter này Mức độ phổ biến của nội trangBiểu đồ ở trên hiển thị các lệnh gọi nội trang Python được sắp xếp theo mức độ phổ biến của chúng. Nói cách khác, bằng cách sử dụng mô-đun 7, người ta có thể phát hiện khi một lệnh gọi hàm được thực hiện và liệu nó có liên quan đến mô-đun 9 hay không. Ba màu được sử dụng để phân biệt trực quan giữa các loại ngoại lệ, việc tạo các loại cơ sở ( 9, 70, 71, 72 và 73) hoặc các chức năng khác. Biểu đồ là số đếm tần số chuẩn hóa, i. e. , tần suất xuất hiện của từng phần tử được cộng dồn trong tất cả các bài tập và chia cho tổng tất cả các phần tử xuất hiện trong tất cả các bài tậpMột vài quan sát
phổ biến mô-đunBiểu đồ trên hiển thị xếp hạng cho các mô-đun. Để đơn giản, chúng tôi giới hạn chỉ báo cáo về các mô-đun gốc. Nếu các mô-đun con được sử dụng, tần số của chúng được cộng dồn vào tần số của các mô-đun gốc tương ứng Như trước đây, biểu đồ có nhiều đuôi, một minh chứng rằng các bài tập PyBites Bite cố gắng “bao quát một chút mọi thứ” Chúng ta có thể quan sát sự hiện diện của các mô-đun không chuẩn, chẳng hạn như 70 và 71, cũng như các mô-đun đặc biệt hơn như 72 và 73 được tạo ra cho mục đích của chính những thách thức đóNgười ta có thể dễ dàng mở rộng phân tích để hiểu các chức năng được sử dụng trong từng mô-đun/mô-đun con, cũng như đi sâu vào phân tích cụ thể hơn. Điều liên quan cần làm nổi bật là các kết quả được báo cáo ở đây được tạo với khoảng 50 dòng mã Python và sử dụng mô-đun 7. Xử lý hơn 300 tệp mã nguồn bằng các công cụ như 75, 76 hoặc bất kỳ công cụ nào khác sẽ khó hơn đáng kểHy vọng rằng các ví dụ này đã cho bạn ý tưởng sơ bộ về những gì bạn có thể đạt được với AST. Bước tiếp theo là hiểu cách tạo cấu trúc dữ liệu như vậy và điều tra thành phần của chúng Phân tích một hướng dẫn chuyển nhượng bằng cách sử dụng mô-đun Module( body=[ Assign( targets=[ Name(id='one_plus_two', ctx=Store())], value=BinOp( left=Constant(value=1), op=Add(), right=Constant(value=2)))], type_ignores=[]) 7Để bắt đầu làm quen với mô-đun 7, hãy xem điều gì sẽ xảy ra khi chúng ta phân tích một lệnh đơn lẻ. 79 7Điều này sẽ xuất ra
Lúc đầu có thể không rõ ràng, nhưng đầu ra được tạo bởi 3 thực sự là một cái cây
Hãy làm lại đầu ra thành sơ đồ với các quy ước sau
Với hình dung này trong tay, chúng ta có thể quan sát một số điều Gốc của cây là một nút 01. Trên thực tế, ngay cả khi ví dụ của chúng tôi là một chương trình dòng đơn, nó vẫn là một mô-đun Python thực sự. Nút chứa hai thuộc tính 02 và 03. Hãy tạm gác 03 sang một bên và tập trung vào 02Vì một mô-đun Python chứa một loạt các hướng dẫn, nên thuộc tính 06 là danh sách các nút, một nút cho mỗi lệnh trong chương trình. Ví dụ của chúng tôi bao gồm một hoạt động chuyển nhượng duy nhất, do đó 06 chỉ chứa một nút 08Một thao tác gán có một bên phải chỉ định thao tác sẽ thực hiện và một bên trái chỉ định đích của thao tác. Hai bên được liên kết với các thuộc tính 09 và 90 của nút 08Xét vế phải, thuộc tính 09 là một nút 93, do lệnh là phép toán nhị phân giữa hai toán hạng, được chỉ định đầy đủ với ba thuộc tính
Xét vế trái, vì Python hỗ trợ nhiều phép gán và giải nén bộ dữ liệu, thuộc tính 90 là một danh sách thu thập các đích khác nhau của thao tác. Trong trường hợp của chúng tôi, phép gán dành cho một biến duy nhất, do đó, một nút 01 duy nhất được sử dụng. Đổi lại, nút 01 có 2 thuộc tính
Thuộc tính >>> code = 'one_plus_two = 1+2 # type: int' >>> tree = ast.parse(code, type_comments=True) >>> print(ast.dump(tree, indent=4)) 1 và loại nhận xétThuộc tính 1 trong phần lớn các trường hợp sẽ là một danh sách trống. Đây là lý do tại sao trong bản phác thảo được tô màu xanh lam. Để hiểu tại sao lại như vậy và mục đích thực sự của thuộc tính là gì, chúng ta cần thực hiện một sự lạc đềTrăn 3. 0 đã giới thiệu các chú thích và vài năm sau, chúng đã được mở rộng thành các gợi ý loại. Nếu bạn không quen thuộc với những khái niệm đó, hãy xem hướng dẫn Real Python này và Những thay đổi đó không được chuyển trở lại Python 2, mà thay vào đó sử dụng các nhận xét loại dưới dạng chú thích. Để biết thêm thông tin, hãy xem hoặc hướng dẫn Real Python này Thuộc tính 1 đề cập đến một nhận xét loại đặc biệt 12 được sử dụng để chỉ ra trình kiểm tra loại (chẳng hạn như mypy) để loại bỏ lỗi nếu tìm thấy lỗi. Vì những lý do cũ, mô-đun 7 vẫn đang báo cáo về những nhận xét đó, nhưng chỉ khi được yêu cầu làm như vậyHãy xem một ví dụ
Điều này sẽ xuất ra
Lưu ý rằng sự khác biệt duy nhất đối với phân tích chi tiết về AST đã thảo luận trước đó là sự hiện diện của thuộc tính 14. Thuộc tính phản ánh siêu dữ liệu được cung cấp bởi loại nhận xét 15 và được thêm vào nút AST cây 08 vì chúng tôi đã chỉ định 17 khi kích hoạt phân tích cú phápTuy nhiên, 12 được đối xử khác. Những nhận xét loại đó được lưu trữ vào thuộc tính 1 dưới dạng đối tượng 00 thay vì được thu thập dưới dạng siêu dữ liệu trong các nút bên trong của cây 7Điều này sẽ xuất ra 7API mô-đun Module( body=[ Assign( targets=[ Name(id='one_plus_two', ctx=Store())], value=BinOp( left=Constant(value=1), op=Add(), right=Constant(value=2)))], type_ignores=[]) 7Mô-đun 7 chủ yếu là một tập hợp lớn các lớp, mỗi lớp dành cho mỗi khía cạnh khác nhau của ngữ pháp Python. Nhìn chung, có khoảng 100 lớp, từ nghĩa đen, đến cấu trúc phức tạp hơn, chẳng hạn như hiểu danh sách 03 là lớp cơ sở cho tất cả các lớp khác trong mô-đun và nó định nghĩa các thuộc tính cơ sở sau cho tất cả các nút AST
Khi xử lý một AST, phần khó nhất là hiểu ngữ nghĩa của các nút và thuộc tính. Thực tế có rất nhiều biến thể và ốp góc nên rất dễ bị nhầm lẫn Một cách tốt để bắt đầu làm quen với AST là sử dụng bảng điều khiển tương tác như 09 tương tự như những gì chúng ta đã làm trong các ví dụ trước. Nếu bạn đã quen với IDE, thì cả PyCharm và Visual Studio Code đều cung cấp plugin để trực quan hóa AST (lưu ý rằng PyCharm sử dụng phiên bản AST của chính nó được gọi là Giao diện cấu trúc chương trình – PSI)Bất kể lựa chọn ưa thích của bạn là gì, tài liệu là nguồn tài nguyên cơ bản cần có trong tầm tay. Tuy nhiên, một vài nhận xét
Bên cạnh các lớp, mô-đun 7 định nghĩa cách thực hiện việc thăm cây và cách thực hiện các phép biến đổiTham quan một ASTBạn có thể truy cập AST theo hai cách. sử dụng các chức năng của trình trợ giúp hoặc thông qua lớp 11Hãy bắt đầu xem xét các chức năng của trình trợ giúp
Dưới đây là một số ví dụ 0Thay vào đó, khi sử dụng 11, người ta có thể đăng ký các cuộc gọi lại cụ thể để kích hoạt khi truy cập các loại nút cụ thể 9trong ví dụ này
Loại ma thuật đen nào xảy ra đằng sau hiện trường để kích hoạt các cuộc gọi lại? . Một 11 cũng định nghĩa một hàm 27 luôn được gọi trước. nếu loại nút đầu vào khớp với một trong các cuộc gọi lại, thì cuộc gọi lại đó sẽ được gọi, nếu không thì 28 được gọi để truy cập nút con. Trong ví dụ của chúng tôi, chúng tôi không ghi đè lên 27, do đó chúng tôi có thể kích hoạt một lượt truy cập vào cây chỉ bằng cách gọi phương thức 0Đây là ví dụ hoàn chỉnh 1Chạy chương trình ta thu được kết quả như sau 0Sửa đổi một ASTMột 30 có thể được sử dụng làm lớp cơ sở cho máy biến áp, tương tự như logic được sử dụng cho lớp khách truy cập. Lần này, thay vì chỉ truy cập các nút, các cuộc gọi lại được sử dụng để sửa đổi, thay thế, thêm các nút mớiĐây là một ví dụ 1trong ví dụ này
Tham chiếu được trả về bởi các cuộc gọi lại đại diện cho nút sẽ sử dụng trong AST. Trong ví dụ này, chúng tôi đang thay thế nút ban đầu. Thay vào đó, khi trả về 33, nút đã truy cập sẽ bị xóa khỏi câyĐể kích hoạt chuyển đổi, chúng tôi sử dụng thao tác tương tự được sử dụng cho lượt truy cập. Lần này, lượt truy cập trả về tham chiếu của cây đã sửa đổi 2Đây là ví dụ đầy đủ 3Mã nguồn trong 34 giống với mã được sử dụng để thực hiện một lượt truy cập đơn giản. Tương tự như vậy, quá trình tạo cây liên quanSau đó, chúng tôi sửa một hạt giống cho trình tạo số ngẫu nhiên thông qua 35, để có đầu ra nhất quán khi chạy chương trình nhiều lầnChúng tôi tạo một đối tượng 36 và chúng tôi truy cập nó thu được 37, đây là phiên bản đã chuyển đổi của cây gốcĐể xác minh các phép biến đổi, chúng tôi có thể in AST và “chạy nó” bằng cách chuyển đổi thành mã thực thi. Để làm như vậy, chúng tôi sử dụng hàm trợ giúp 38
Đây là đầu ra liên quan đến 45 4Đầu ra cho 46 5Đầu ra bây giờ là "ngẫu nhiên", như mong đợi của phép biến đổi. Tuy nhiên, phép biến đổi đã ghi đè lên cây ban đầu, vì 37 và 48 là cùng một đối tượng 6Tuy nhiên, để tránh điều này, người ta chỉ cần sử dụng lệnh để sao chép toàn bộ cây trước khi kích hoạt chuyển đổi hoặc ghi đè phương thức 27 và xác định logic đặc biệt cho trường hợp sử dụng hiện tại
Làm cách nào để sử dụng ast trong Python?Ví dụ - . nhập khẩu ast biểu thức = '6 + 8' mã = ast. phân tích cú pháp (biểu thức, chế độ = 'eval') in (eval (biên dịch (mã, '', chế độ = 'eval'))) in (ast. kết xuất (mã)) Ast có được tích hợp vào Python không?ast là một mô-đun trong thư viện chuẩn của python . Mã Python cần được chuyển đổi thành Cây cú pháp trừu tượng (AST) trước khi trở thành “mã byte”(. tệp pyc).
ast trong mã hóa là gì?Cây cú pháp trừu tượng, hay AST, là biểu diễn cây mã nguồn của chương trình máy tính truyền đạt cấu trúc của mã nguồn. Each node in the tree represents a construct occurring in the source code.
phân tích cú pháp () trong Python là gì?hàm parse() chia mã nguồn thành các mã thông báo dựa trên ngữ pháp . Những mã thông báo này sau đó được chuyển đổi để xây dựng Cây cú pháp trừu tượng (AST). Nó là một biểu diễn cây của một mã nguồn. |