2011-07-21 33 views
8

Tôi đang cố gắng sử dụng deepcopy (từ mô-đun copy) để sao chép sâu một cây nút từ mô-đun ast.Python: sao chép sâu cây nút ast

Điều này dường như không hoạt động. Tôi nhận được các lỗi lạ như TypeError: required field "name" missing from FunctionDef khi tôi sử dụng kết quả đã sao chép (và tôi đã kiểm tra nó; nó thực sự bị thiếu trong nút sao chép), vì vậy nó đã không sao chép chúng một cách chính xác.

Có mẹo nào tôi có thể thực hiện việc này không? Hoặc có lẽ tôi đang thiếu một cái gì đó?

+0

Với câu hỏi như thế này, đó là trò chơi đoán. Nói chung không có "thủ đoạn", vui lòng đăng mã có liên quan của bạn. – Trufa

+1

Tôi nghĩ đây là một câu hỏi hay và hoàn toàn rõ ràng vấn đề của anh ấy là gì, +1. – agf

+1

@agf: Tôi đã xóa bỏ phiếu bầu của mình chỉ trong trường hợp. Có vẻ như tôi đã sai về nó vì tôi thiếu kiến ​​thức kỹ thuật về chủ đề này, có lẽ nó trông giống như một câu hỏi mơ hồ, nếu đúng như vậy, tôi xin lỗi Albert. – Trufa

Trả lời

8

Xin lỗi, tôi đã sai. copy.deepcopy dường như hoạt động chính xác. Lý do tôi nghĩ rằng nó sẽ không hoạt động là vì hành vi rất kỳ quặc này:

import ast, copy 
n = ast.FunctionDef(
     name=None, 
     args=ast.arguments(args=[], vararg=None, kwarg=None, defaults=[]), 
     body=[], decorator_list=[]) 
n.name = "foo" 
ast.fix_missing_locations(n) 
n = copy.deepcopy(n) 
print n.name 

Điều này trả về None trong PyPy. Có lẽ một lỗi vì trong CPython 2.6, tôi nhận được foo. Kỳ lạ thay, trong PyPy, nếu tôi xóa name=None khỏi cuộc gọi ast.FunctionDef, tôi cũng nhận được foo làm đầu ra.

Tôi đã tạo một bug report for PyPy về việc này.

Các vấn đề liên quan