2011-07-21 17 views
8

ast modülünden bir düğüm ağacını derinlemesine kopyalamak için deepcopy (copy modülünden) kullanmaya çalışıyorum.Python: Ast düğüm ağacını derinden kopyalayın

Bu işe yaramıyor gibi görünüyor. Kopyalanan sonucu kullandığımda TypeError: required field "name" missing from FunctionDef gibi garip hatalar alıyorum (ve ben işaretliyim; kopyalanan düğümde gerçekten eksiktir), dolayısıyla doğru şekilde kopyalanmadı.

Bu çalışmayı yapabileceğim bir numara var mı? Ya da belki bir şeyi özlüyorum mu?

+0

Bu gibi bir soruyla, bir tahmin oyunu. Genellikle "numaralar" yoktur, lütfen ilgili kodu gönderin. – Trufa

+1

Bunun iyi bir soru olduğunu düşünüyorum ve sorunun ne olduğunu açıkça belirtin, +1. – agf

+1

@agf: Her durumda, oy kullanma hakkımı kaldırdım. Konuyla ilgili teknik bilgi eksikliğim yüzünden yanılmışım gibi görünüyor, belki de belirsiz bir soru gibi görünüyor, eğer durum buysa, Albert için özür dilerim. – Trufa

cevap

8

Üzgünüm, yanılmışım. copy.deepcopy düzgün çalışıyor gibi görünüyor. Ben işe düşündüm sebebi bu çok garip davranışın geçerli:

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 

Bu PYPY içinde None döndürür. Muhtemelen bir hata çünkü CPython 2.6'da foo elde ediyorum. Garip bir şekilde, PyPy'de name=None'u ast.FunctionDef numaralı çağrıdan kaldırırsam, çıkış olarak da foo alırım.

Bu konuda bir bug report for PyPy oluşturdum.