Es wird langsam aber sicher peinlich...
Ich war grad in der Bibliothek und habe sämtlichste Pythonbücher durchforstet und nirgends etwas über ast gelesen ...
Also um mal eine Orientierung zu geben:
Ich versuche aus
zu kreieren und dann auszuführen.
Mein Ansatz bisher:
Code: Alles auswählen
''' Diese Klasse ist nur zum Betrachten möglicher Zwischenschritte'''
class v(ast.NodeVisitor):
def generic_visit(self,node):
print type(node).__name__
ast.NodeVisitor.generic_visit(self, node)
def visit_Name(self, node):
print "Name: ", node.id
''' Eigentliche Bearbeitung'''
class t(ast.NodeTransformer):
''' Wenn impl gefunden wurde, mache daraus einen Num-Knoten mit dem Wert 3 '''
def visit_Name(self,node):
if node.id =="impl":
return ast.Num(3)
else:
return node
Ausführung:
Code: Alles auswählen
my = ast.parse("impl > 3 and mode =='unset'", mode="eval")
t().visit(my)
v().visit(my)
--->
Expression
BoolOp
And
Compare
Num
Gt
Num
Compare
Name: mode
Eq
Str
Das sieht eigentlich ganz gut aus, dachte ich bisher.
Aber nun;
Code: Alles auswählen
c = compile(my, "<string>", mode="eval")
--->
required field "lineno" missing from expr
Ich kann die Fehlermeldung nicht deuten und bitte nochmals um Hilfe und Korrektur
Wahrscheinlich muss ich noch copy_location aufrufen
EDIT:
Code: Alles auswählen
class t(ast.NodeTransformer):
....: def visit_Name(self,node):
....: if type(d[node.id]).__name__ in ["int", "float"]:
....: new_node = ast.Num(d[node.id])
....: ast.copy_location(new_node, node)
....: return new_node
....: else:
....: new_node = ast.Str(d[node.id])
....: ast.copy_location(new_node, node)
....: return new_node
....:
scheint zu funktionieren, wobei d ein dictionary ist.
Aber wenn ich die Dokumentation richtig verstehe, sollte das, was ich vorhabe mir Subscript etwas leichter gehen.
Verbesserungen erwünscht