Phiên bản Python ast

# -*- mã hóa. utf-8 -*-""" ast ~~~ Mô-đun `ast` giúp các ứng dụng Python xử lý các cây ngữ pháp cú pháp trừu tượng của Python. Bản thân cú pháp trừu tượng có thể thay đổi với mỗi bản phát hành Python; . Một cây cú pháp trừu tượng có thể được tạo bằng cách chuyển `ast. PyCF_ONLY_AST` làm cờ cho hàm dựng sẵn `compile[]` hoặc bằng cách sử dụng hàm `parse[]` từ mô-đun này. Kết quả sẽ là một cây các đối tượng có tất cả các lớp kế thừa từ `ast. AST`. Một cây cú pháp trừu tượng đã sửa đổi có thể được biên dịch thành một đối tượng mã Python bằng cách sử dụng hàm `compile[]` tích hợp. Ngoài ra, các chức năng trợ giúp khác nhau được cung cấp giúp làm việc với cây đơn giản hơn. Mục đích chính của các hàm trợ giúp và mô-đun này nói chung là cung cấp giao diện dễ sử dụng cho các thư viện hoạt động chặt chẽ với cú pháp python [ví dụ: công cụ mẫu]. . bản quyền. Bản quyền 2008 của Armin Ronacher. . giấy phép. Giấy phép Python. """ from _ast import * from _ast import __version__def parse[source, filename='', mode='exec']. """ Phân tích cú pháp nguồn thành nút AST. Tương đương với biên dịch [nguồn, tên tệp, chế độ, PyCF_ONLY_AST]. """ return compile[source, filename, mode, PyCF_ONLY_AST]def literal_eval[node_or_string]. """ Đánh giá an toàn nút biểu thức hoặc chuỗi chứa biểu thức Python. Chuỗi hoặc nút được cung cấp chỉ có thể bao gồm các cấu trúc chữ Python sau. chuỗi, số, bộ dữ liệu, danh sách, ký tự, booleans và Không. """ _safe_names = {'Không'. Không, 'Đúng'. Đúng sai'. Sai} nếu isinstance[node_or_string, basestring]. node_or_string = parse[node_or_string, mode='eval'] if isinstance[node_or_string, Expression]. nút_or_string = nút_or_string. cơ thể def _convert [nút]. nếu isinstance[nút, Str]. nút trở lại. s elif isinstance[node, Num]. nút trở lại. n elif isinstance[nút, Tuple]. trả về bộ dữ liệu [bản đồ [_convert, nút. elts]] elif isinstance[nút, Danh sách]. danh sách trả về [bản đồ [_convert, nút. elts]] elif isinstance[nút, Dict]. trả về dict[[_convert[k], _convert[v]] cho k, v trong zip[nút. phím, nút. giá trị]] elif isinstance[nút, Tên]. nếu nút. id trong _safe_names. trả về _safe_names[nút. id] elif isinstance[nút, BinOp] và \ isinstance[nút. op, [Thêm, Phụ]] và \ isinstance[nút. phải, Num] và \ isinstance[nút. đúng. n, phức tạp] và \ isinstance[nút. trái, Num] và \ isinstance[nút. trái. n, [int, dài, float]]. trái = nút. trái. n phải = nút. đúng. n nếu isinstance[nút. tùy ý, Thêm]. quay lại trái + phải khác. trả về trái - phải tăng ValueError['malforming string'] return _convert[node_or_string]def dump[node, annotate_fields=True, include_attributes=False]. """ Trả về kết xuất được định dạng của cây trong *node*. Điều này chủ yếu hữu ích cho mục đích gỡ lỗi. Chuỗi trả về sẽ hiển thị tên và giá trị cho các trường. Điều này làm cho mã không thể đánh giá được, vì vậy nếu muốn đánh giá thì *annotate_fields* phải được đặt thành Sai. Các thuộc tính như số dòng và độ lệch cột không được đổ theo mặc định. Nếu muốn, *bao gồm các thuộc tính* có thể được đặt thành True. """ def _format [nút]. nếu isinstance[nút, AST]. các trường = [[a, _format[b]] cho a, b trong iter_fields[nút]] rv = '%s[%s' % [nút. __lớp__. __Tên__, ', '. tham gia [ ['%s=%s' % trường cho trường trong các trường] nếu chú thích_trường khác [b cho a, b trong các trường] ]] nếu bao gồm các thuộc tính và nút. _thuộc tính. các trường rv += và ', ' hoặc ' ' rv += ', '. tham gia['%s=%s' % [a, _format[getattr[node, a]]] cho một nút trong. _attributes] return rv + ']' elif isinstance[node, list]. trả về '[%s]' % ', '. tham gia [_format [x] cho x trong nút] trả về repr [nút] nếu không phải là trường hợp [nút, AST]. tăng TypeError['AST mong đợi, có %r' % nút. __lớp__. __name__] return _format[node]def copy_location[new_node, old_node]. """ Sao chép vị trí nguồn [thuộc tính `lineno` và `col_offset`] từ *old_node* sang *new_node* nếu có thể và trả về *new_node*. """ cho attr trong 'lineno', 'col_offset'. nếu attr trong old_node. _attributes và attr trong new_node. _attributes \ và hasattr[old_node, attr]. setattr[new_node, attr, getattr[old_node, attr]] return new_nodedef fix_missing_locations[node]. """ Khi bạn biên dịch một cây nút bằng compile[], trình biên dịch sẽ yêu cầu các thuộc tính lineno và col_offset cho mọi nút hỗ trợ chúng. Điều này khá tẻ nhạt để điền vào các nút được tạo, vì vậy trình trợ giúp này thêm các thuộc tính này theo cách đệ quy ở nơi chưa được đặt, bằng cách đặt chúng thành các giá trị của nút cha. Nó hoạt động đệ quy bắt đầu từ *node*. """ def _fix[nút, lineno, col_offset]. nếu 'lineno' trong nút. _thuộc tính. nếu không hasattr[nút, 'lineno']. nút. lineno = lineno khác. lineno = nút. lineno nếu 'col_offset' trong nút. _thuộc tính. nếu không hasattr[nút, 'col_offset']. nút. col_offset = col_offset khác. col_offset = nút. col_offset cho con trong iter_child_nodes[node]. _fix[con, lineno, col_offset] _fix[nút, 1, 0] return nodedef increment_lineno[nút, n=1]. """ Tăng số dòng của mỗi nút trong cây bắt đầu từ *nút* theo *n*. Điều này rất hữu ích để "di chuyển mã" đến một vị trí khác trong một tệp. """ cho trẻ đang đi bộ [nút]. nếu 'lineno' ở trẻ. _thuộc tính. trẻ em. lineno = getattr[con, 'lineno', 0] + n return nodedef iter_fields[node]. """ Mang lại một bộ ``[tên trường, giá trị]`` cho mỗi trường trong ``nút. _fields`` có trên *node*. """ cho trường trong nút. _lĩnh vực. cố gắng. trường năng suất, getattr[nút, trường] ngoại trừ AttributeError. passdef iter_child_nodes[nút]. """ Mang lại tất cả các nút con trực tiếp của *nút*, nghĩa là tất cả các trường là các nút và tất cả các mục của các trường là danh sách các nút. """ cho tên, trường trong iter_fields[node]. nếu isinstance[trường, AST]. trường năng suất elif isinstance[trường, danh sách]. cho mục trong trường. if isinstance[item, AST]. năng suất itemdef get_docstring[node, clean=True]. """ Trả về chuỗi tài liệu cho nút đã cho hoặc Không có nếu không tìm thấy chuỗi tài liệu nào. Nếu nút được cung cấp không có tài liệu, TypeError sẽ được nâng lên. """ nếu không phải là phiên bản [nút, [FunctionDef, ClassDef, Mô-đun]]. tăng TypeError["%r khong co docstrings" % node. __lớp__. __name__] nếu nút. cơ thể và isinstance [nút. body[0], Expr] và \ isinstance[node. cơ thể[0]. giá trị, Str]. nếu sạch sẽ. kiểm tra nhập khẩu kiểm tra trả lại. cleandoc[nút. cơ thể[0]. giá trị. s] nút trả về. cơ thể[0]. giá trị. đi bộ sdef [nút]. """ Sinh ra đệ quy tất cả các nút con trong cây bắt đầu từ *nút* [bao gồm cả chính *nút*], không theo thứ tự cụ thể. Điều này hữu ích nếu bạn chỉ muốn sửa đổi các nút tại chỗ và không quan tâm đến ngữ cảnh. """ from collections import deque todo = deque[[node]] while todo. node = todo. popleft[] việc cần làm. mở rộng [iter_child_nodes [nút]] năng suất lớp nút NodeVisitor [đối tượng]. """ Một lớp cơ sở khách truy cập nút duyệt cây cú pháp trừu tượng và gọi hàm khách truy cập cho mọi nút được tìm thấy. Hàm này có thể trả về một giá trị được chuyển tiếp theo phương thức `visit`. Lớp này có nghĩa là được phân lớp, với lớp con thêm các phương thức khách truy cập. Theo mặc định, các chức năng của khách truy cập cho các nút là ``'visit_'`` + tên lớp của nút. Vì vậy, chức năng truy cập nút `TryFinally` sẽ là `visit_TryFinally`. Hành vi này có thể được thay đổi bằng cách ghi đè phương thức `visit`. Nếu không có chức năng khách truy cập cho một nút [giá trị trả về `Không`], thì khách truy cập `generic_visit` được sử dụng thay thế. Không sử dụng `NodeVisitor` nếu bạn muốn áp dụng các thay đổi cho các nút trong quá trình di chuyển ngang. Đối với điều này, tồn tại một khách truy cập đặc biệt [`NodeTransformer`] cho phép sửa đổi. """ chắc chắn truy cập [bản thân, nút]. """Truy cập một nút. Phương thức """ = 'visit_' + nút. __lớp__. __name__ khách truy cập = getattr[self, method, self. generic_visit] trả lại khách truy cập [nút] def generic_visit [bản thân, nút]. """Được gọi nếu không tồn tại chức năng khách truy cập rõ ràng cho một nút. """ cho trường, giá trị trong iter_fields[node]. if isinstance[giá trị, danh sách]. cho mặt hàng có giá trị. if isinstance[item, AST]. bản thân. lượt truy cập [mục] elif isinstance [giá trị, AST]. bản thân. truy cập [giá trị] lớp NodeTransformer [NodeVisitor]. """ MỘT. lớp. Lớp con `NodeVisitor` đi theo cây cú pháp trừu tượng và cho phép sửa đổi các nút. `NodeTransformer` sẽ đi bộ AST và sử dụng giá trị trả về của các phương thức khách truy cập để thay thế hoặc xóa nút cũ. Nếu giá trị trả về của phương thức khách truy cập là ``None``, thì nút sẽ bị xóa khỏi vị trí của nó, nếu không, nó sẽ được thay thế bằng giá trị trả về. Giá trị trả về có thể là nút ban đầu trong trường hợp không có sự thay thế nào diễn ra. Dưới đây là một ví dụ về trình chuyển đổi ghi lại tất cả các lần xuất hiện tra cứu tên [``foo``] thành ``data['foo']``. lớp RewriteName [NodeTransformer]. def visit_Name[bản thân, nút]. trả về copy_location[Subscript[ value=Name[id='data', ctx=Load[]], slice=Index[value=Str[s=node. id]], ctx=nút. ctx ], node] Hãy nhớ rằng nếu nút bạn đang vận hành có các nút con, bạn phải tự chuyển đổi các nút con đó hoặc gọi hàm. meth. phương thức `generic_visit` cho nút trước. Đối với các nút là một phần của tập hợp các câu lệnh [áp dụng cho tất cả các nút câu lệnh], khách truy cập cũng có thể trả về danh sách các nút thay vì chỉ một nút duy nhất. Thông thường bạn sử dụng máy biến áp như thế này. nút = YourTransformer[]. lượt truy cập [nút] """ def generic_visit [bản thân, nút]. đối với trường, old_value trong iter_fields[nút]. old_value = getattr[nút, trường, Không] nếu isinstance[old_value, list]. new_values ​​= [] cho giá trị trong old_value. nếu isinstance[giá trị, AST]. giá trị = bản thân. truy cập [giá trị] nếu giá trị là Không có. tiếp tục elif không isinstance[giá trị, AST]. new_values. mở rộng [giá trị] tiếp tục new_values. nối thêm [giá trị] old_value [. ] = new_values ​​elif isinstance[old_value, AST]. new_node = bản thân. truy cập [old_value] nếu new_node là Không có. delattr[nút, trường] khác. nút trả về setattr[nút, trường, new_node]

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ó phải là thư viện Python chuẩn 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]. Tạo AST là chức năng quan trọng nhất của ast, nhưng có nhiều cách hơn để người ta có thể sử dụng mô-đun.

AST có phải là cây nhị phân không?

Cây nhị phân có nhiều công dụng. Trên thực tế, các trình biên dịch thường sử dụng chúng để xây dựng cái được gọi là cây cú pháp trừu tượng [hoặc AST] — một biểu diễn trung gian của mã chưa được biên dịch đầy đủ. Trình phân tích cú pháp JavaScript cũng sử dụng AST, mặc dù đó là cây tổng quát, không phải cây nhị phân .

AST trong cú pháp là gì?

Trong khoa học máy tính, cây cú pháp trừu tượng [AST], hay đơn giản là cây cú pháp, là một dạng cây biểu diễn cấu trúc cú pháp trừu tượng của văn bản [thường là mã nguồn] được viết bằng một . .

Chủ Đề