Announcement

Collapse
No announcement yet.

Python: AST-Modul richtig einsetzen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Python: AST-Modul richtig einsetzen?

    Hey Leute,

    vorweg: ich habe das Thema bereits in zwei anderen Communitys veröffentlicht:
    http://stackoverflow.com/questions/3...s-ast-function
    https://www.python-forum.de/viewtopic.php?f=1&t=37445

    Da ich aber auf das jetzt anliegendes Problem keine Rückmeldung erhalte, möchte ich mich gerne hier an jemanden wenden.. Sollte sich das ändern, so werde ich das hier entsprechend aktualisieren.

    Es geht darum, mit dem AST-Modul Methoden-Parameter aus fremd liegenden Python-Dateien auszulesen. Hier ist das Beispiel-Inhalt von dem, was ich auslesen will:

    extra_host_conf.setdefault('alias', []).extend( [(u'alias1', ['host1']), (u'alias2', ['host2']), (u'alias3', ['host3'])])
    Hiervon brauche ich die Liste, die als Parameter der Methode extend() angegeben ist. Zusätzlich muss ich allerdings auch prüfen, ob im Parameter des ersten Methodenaufrufs setdefault() das Stichwort "alias" angegeben ist.

    Folgend lasse ich mir den Parameter "alias" ausgeben:
    Code:
    import ast
    
    class MyVisitor(ast.NodeVisitor):
        def visit_Call(self, node):
            if node.func.attr == "setdefault":
                print ast.literal_eval(node.args[0])
            self.generic_visit(node)
    Und so komme ich an die benötigte Liste:
    Code:
    import ast
        class MyVisitor(ast.NodeVisitor):
            def visit_Call(self, node):
                if node.func.attr == "extend":
                    print ast.literal_eval(node.args[0])
                self.generic_visit(node)
    Ich weiß nun allerdings nicht, wie ich beides verknüpfen kann. Sprich: wie ich erst den String "alias" überprüfe, und falls dieser so vorhanden ist, mir nur dann die Liste ausgebe.

    Ich habe mir zuvor einige Methoden geschrieben, um mir die Typen der verschiedenen Code-Teile ausgeben zu lassen. Vielleicht hilft das an dieser Stelle weiter:
    [(u'alias1', ['host1']), (u'alias2', ['host2']), (u'alias3', ['host3'])]
    Type: Call

    extend
    Type: Attribute

    alias
    Type: Call

    setdefault
    Type: Attribute

    extra_host_conf
    Type: Name

    alias
    Type: Str
    Ich bekomme es einfach nicht hin und hoffe, dass man mir hier vielleicht weiter helfen kann.. :/
    Zuletzt editiert von kogen; 26.11.2015, 10:15.
Working...
X