Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by haas.homelinux.net...

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 13 Weitere Spracheigenschaften
  Pfeil 13.1 Exception Handling
    Pfeil 13.1.1 Eingebaute Exceptions
    Pfeil 13.1.2 Werfen einer Exception
    Pfeil 13.1.3 Abfangen einer Exception
    Pfeil 13.1.4 Eigene Exceptions
    Pfeil 13.1.5 Erneutes Werfen einer Exception
  Pfeil 13.2 List Comprehensions
  Pfeil 13.3 Docstrings
  Pfeil 13.4 Generatoren
  Pfeil 13.5 Iteratoren
  Pfeil 13.6 Interpreter im Interpreter
  Pfeil 13.7 Geplante Sprachelemente
  Pfeil 13.8 Die with-Anweisung
  Pfeil 13.9 Function Decorator
  Pfeil 13.10 assert
  Pfeil 13.11 Weitere Aspekte der Syntax
    Pfeil 13.11.1 Umbrechen langer Zeilen
    Pfeil 13.11.2 Zusammenfügen mehrerer Zeilen
    Pfeil 13.11.3 String conversions


Galileo Computing - Zum Seitenanfang

13.6 Interpreter im Interpreter  topZur vorigen Überschrift

In bestimmten Fällen ist es nützlich, vom Benutzer eingegebenen oder anderweitig zur Laufzeit geladenen Python-Code aus einem Python-Programm heraus ausführen zu können. Stellen Sie sich einmal vor, Sie wollten ein Programm schreiben, das Wertetabellen für beliebige Funktionen mit einem ganzzahligen Parameter darstellen kann. Für ein solches Programm muss der Benutzer die Funktion festlegen können. Anstatt dafür eine eigene Sprache zu definieren und einen eigenen Parser und Compiler zu schreiben, bietet es sich an, Funktionsdefinitionen in Python-Syntax zu erlauben.

Mithilfe des exec-Statements können wir genau dies erreichen. Pythons exec-Anweisung erwartet einen String als Parameter, der den auszuführenden Code enthält. Alternativ kann auch ein geöffnetes Datei-Objekt an exec übergeben werden.

Um beispielsweise eine vom Benutzer eingegebene Funktion für die Ausgabe einer kleinen Wertetabelle zu benutzen, dient der folgende Code-Schnipsel:

print "Definieren Sie eine Funktion f mit einem Parameter:" 
definition = raw_input() 
exec definition 
for i in range(5): 
    print "f(%d) = %f" % (i, f(i))

Ein Programmlauf könnte dann wie folgt aussehen:

Definieren Sie eine Funktion f mit einem Parameter: 
def f(x): return x*x 
f(0) = 0.000000 
f(1) = 1.000000 
f(2) = 4.000000 
f(3) = 9.000000 
f(4) = 16.000000

Wie Sie sehen, ist die Funktion f, die von dem Benutzer definiert wurde, nach dem Ausführen von exec im lokalen Namensraum unseres Programms verfügbar, denn wir können sie ganz normal aufrufen. Ebenso kann der Benutzer neue Variablen anlegen oder den Wert bereits bestehender Variablen auslesen, was allerdings ein Sicherheitsrisiko darstellt.

Um die Sicherheit zu erhöhen, kann man den mit exec ausgeführten Code in einem eigenen Namensraum »einsperren«. Alle neuen Variablen, Klassen und Funktionen werden in diesem gesonderten Namensraum abgelegt. Außerdem sind dem exec-Code nur noch die Variablen zugänglich, die in seinem Namensraum vorhanden sind. Ein Namensraum ist ein einfaches Dictionary, das den Referenznamen ihre Werte zuordnet. Um einem exec-Statement einen eigenen Namensraum zu geben, stellt man das Dictionary zusammen mit einem in hinten an:

>>> kontext = {"pi" : 3.1459} 
>>> exec "print pi" in kontext 
3.1459

Alle Referenzen, die innerhalb des exec-Codes definiert wurden, sind anschließend auch in dem übergebenen Kontext definiert. Damit können wir unser Einstiegsbeispiel gegen ungewollte Seiteneffekte absichern. Den Wert der Kreiszahl π wollen wir dem Benutzer auch für seine Funktionen zugänglich machen:

print "Definieren Sie eine Funktion f mit einem Parameter:" 
definition = raw_input() 
kontext = {"pi" : 3.1459} 
exec definition in kontext 
for i in range(5): 
    print "f(%d) = %f" % (i, kontext['f'](i))

Ein Beispiellauf, in dem der Benutzer eine Funktion für die Berechnung der Kreisfläche anhand des Kreisradius eingibt, sähe dann so aus:

Definieren Sie eine Funktion f mit einem Parameter: 
def f(r): return pi * r*r 
f(0) = 0.000000 
f(1) = 3.145900 
f(2) = 12.583600 
f(3) = 28.313100 
f(4) = 50.334400

Ausdrücke auswerten mit eval

Während mit exec beliebiger Python-Code ausgeführt werden kann, dient die Built-in Function eval dazu, Python-Ausdrücke auszuwerten und das Ergebnis zurückzugeben:

>>> eval("5 * 4") 
20

Auch der von eval ausgewertete Ausdruck hat standardmäßig Zugriff auf alle Variablen des aktuellen Kontexts. Durch die beiden zusätzlichen Parameter globals und locals kann ein benutzerdefinierter Kontext festgelegt werden.

>>> x = 10 
>>> eval("5 * x") 
50 
>>> eval("5 * x", {}) 
Traceback (most recent call last): 
  File "<pyshell#4>", line 1, in <module> 
    eval("5 * x", {}) 
  File "<string>", line 1, in <module> 
NameError: name 'x' is not defined

Beim ersten Aufruf von eval konnten wir auf die globale Variable x zugreifen, weil der Kontext einfach kopiert wurde. Der zweite Aufruf hingegen bekam ein leeres Dictionary als Kontext übergeben, weshalb der versuchte Zugriff auf x mit einer Exception quittiert wurde.

Die vollständige Schnittstelle von eval sieht folgendermaßen aus:

eval(expression[, globals[, locals]])


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python






Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux






 Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Praxisbuch Web 2.0






 Praxisbuch Web 2.0


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Praxisbuch Objektorientierung






 Praxisbuch Objektorientierung


Zum Katalog: Einstieg in SQL






 Einstieg in SQL


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo