In Python integrierte Funktion - eval
eval
evaleval(expression [, globals [, locals]])
Diese Funktion wird verwendet, um eine Ausdruckszeichenfolge dynamisch auszuführen oder eine Kompilierungsfunktion zu kompilieren Das Codeobjekt das kommt raus.
Der Parameter Ausdruck ist eine Ausdruckszeichenfolge oder der Name des kompilierten Codeobjekts
Der Parameter Globals ist der globale Namespace, der beim Ausführen des Ausdrucks den Umfang des globalen Bereichs angeben kann welche Module genutzt werden können.
Wenn dieser Parameter standardmäßig verwendet wird, wird der aktuelle globale Namespace verwendet, der diese Funktion derzeit aufruft.
Der Parameter locals ist der lokale Bereichsnamespace, der verwendet wird, um den lokalen Namespace anzugeben, auf den beim Ausführen des Ausdrucks zugegriffen wird.
Wenn der globale Namespace-Parameter angezeigt wird, aber das standardmäßige integrierte Modul verwendet wird, wird das Modul automatisch in den globalen Namespace kopiert.
Das bedeutet, dass das integrierte Modul dies unabhängig von seiner Einstellung tun kann verwendet werden.
Wenn beide Namespaces die Standardmethode verwenden, wird beim Aufrufen dieser Funktion der Namespace verwendet, um die entsprechende Variable zu finden.
Warum diese Funktion verwenden?
Der Grund für diese Funktion sollte der Unterschied zwischen dynamischen Sprachen und kompilierten Sprachen sein.
Denn es ist grundsätzlich unmöglich, Code in kompilierten Sprachen zu generieren bedeutet, dass die Software auf dem Server bereitgestellt wurde,
aber solange es nur sehr wenige Änderungen gibt, müssen Sie diesen Teil des Codes direkt ändern, und die Änderungen können sofort implementiert werden, ohne die gesamte Software neu laden zu müssen.
Darüber hinaus kann diese Funktion beim maschinellen Lernen verwendet werden
Zum Beispiel kann der Code je nach Häufigkeit und Art der Verwendung der Software dynamisch geändert werden, um sich an Benutzeränderungen anzupassen.
Wenn man darüber nachdenkt: Verfügt es über die Fähigkeit, den Code selbst zu aktualisieren und einen besseren Fortschritt zu erzielen?
Wenn es destruktive Aktionen ausführt, handelt es sich tatsächlich um einen Virus.
>>> eval('1+1')
2
#全局命名空间为空,使用局部命名空间 >>> def make_fn(code): import math ALLOWED_LOCALS = {v:getattr(math,v) for v in filter( lambda x: x.startswith('_'),dir(math)) } return eval('lambda x: %s'%code ,None,ALLOWED_LOCALS) >>> f = make_fn('x+1') >>> print f(2)
#使用全局命名空间 >>> def make_fng(code): import math ALLOWED = {v:getattr(math, v) for v in filter(lambda x: not x.startswith('_'), dir(math)) } ALLOWED['__builtins__'] = None return eval('lambda x: %s' % code, ALLOWED, {}) >>> f = make_fng('cos(x)') >>> print f(9) -0.911130261885 >>> f = make_fng('cos(x*x)') >>> print f(9) 0.776685982022