Ist es peinlich, pythons getattr ausgiebig zu benutzen?

7

Ich erstelle eine Shell-ähnliche Umgebung. Meine ursprüngliche Methode, Benutzereingaben zu handhaben, war die Verwendung eines Dictionary-Mapping-Befehls (Strings) zu Methoden verschiedener Klassen, wobei die Tatsache genutzt wurde, dass Funktionen erstklassige Objekte in Python sind.

Aus Gründen der Flexibilität (hauptsächlich für das Parsen von Befehlen), überlege ich, mein Setup so zu ändern, dass ich getattr (command) verwende, um die benötigte Methode zu erhalten und am Ende meines Parsers Argumente an sie zu übergeben . Ein weiterer Vorteil dieses Ansatzes besteht darin, dass ich mein (derzeit statisch implementiertes) Befehlswörterbuch nicht jedes Mal aktualisieren muss, wenn ich eine neue Methode / einen neuen Befehl hinzufüge.

Meine Frage ist zweifach. Erstens, hat getattr die gleichen Probleme wie eval? Zweitens, werde ich einen Schlag auf die Effizienz meiner Shell bekommen? Spielt es eine Rolle, wie viele Methoden / Befehle ich habe? Ich sehe gerade 30 Befehle an, die sich eventuell verdoppeln könnten.

    
Wilduck 26.05.2010, 00:21
quelle

2 Antworten

20

Der Unterschied zwischen direktem Attributzugriff und der Verwendung von getattr () sollte ziemlich vernachlässigbar sein. Sie können den Unterschied zwischen den Bytecodes der beiden Versionen erkennen, indem Sie das Modul dis von Python verwenden, um die beiden Ansätze zu vergleichen:

%Vor%

Es hört sich jedoch so an, als ob Sie eine Shell entwickeln, die sehr ähnlich ist wie die Python-Bibliothek cmd Kommandozeilen-Shells. Mit cmd können Sie Shells erstellen, die Befehle ausführen, indem Sie den Befehlsnamen mit einer Funktion vergleichen, die für ein cmd.Cmd -Objekt wie folgt definiert ist:

%Vor%

Sie können mehr über das Modul in der Dokumentation oder in Ссылка

lesen     
146 26.05.2010, 02:07
quelle
6
  

hat getattr die gleichen Probleme wie eval?

No - code mit eval() ist schrecklich nervig zu pflegen und kann ernsthafte Sicherheitsprobleme haben. Der Aufruf von getattr(x, "foo") ist nur eine weitere Möglichkeit, x.foo zu schreiben.

  

werde ich einen Schlag auf die Effizienz meiner Shell nehmen

Es wird unmerklich langsamer, wenn der Befehl nicht gefunden wird, aber nicht genug, um eine Rolle zu spielen. Sie würden es nur bemerken, wenn Sie Benchmarks mit Zehntausenden von Einträgen durchführen.

    
John Millikin 26.05.2010 00:46
quelle

Tags und Links