Umstieg auf Python 3

Technische Mitteilung #59

Von Tessa Hayman

Mai 2021

Mit der aktuellen Version von Aimsun Next 20 besteht jetzt die Möglichkeit, Aimsun Next mit Python 3 zu . verwenden. Es gibt jedoch einige wesentliche Unterschiede zwischen Python 2 und Python 3, auf die Sie achten sollten, wenn Sie mit der Konvertierung Ihrer Modelle und Skripte beginnen. Diese technische Mitteilung erläutert die wichtigsten Unterschiede und zeigt Ihnen, wie Sie Ihr Python-2-Skript aktualisieren, um es Python-3fähig zu machen.

Python 2 wurde im Januar 2020 eingestellt,was bedeutet, dass es keine weiteren Updates oder Bugfixes und vor allem keine Sicherheitspatches mehr erhält. Wir empfehlen daher, für Neuentwicklungen nur noch Python 3 zu verwenden. Ein Großteil des Python3-Codes in der Aimsun-Software kann auch in Python 2 verwendet werden. Es kann jedoch sein, dass Ihr altes Skript beider Verwendung mit Python 3 – insbesondere im Zusammenhang mit Druckanweisungen – zu Fehlern führt!

Neben den Druckanweisungen sollten Sie die wichtigsten Unterschiede kennen, damit Sie überprüfen können, was geändert werden muss, wenn Sie dasselbe Skript oder dieselbe Kostenfunktion für mehrere Modelle verwenden möchten, da einige Änderungen in Ihrem Skript unter Umständen nicht zu Fehlerausgaben führen.

Print

Die meisten Änderungen betreffen die Druckanweisungen. In Python 3 sollten Druckanweisungen in Klammern gesetzt werden..

Python 2
				
					print “hello” 
				
			
Python 3
				
					print (“hello”)  
				
			

Ganzzahlige Division

In Python 2 wurde bei einer Division zweier ganzzahliger Variablen ein ganzzahliger Wert gebildet. In Python 3 wurde dies dahingehend geändert, dass jetzt ein Fließkommawert ausgegeben wird, was vor einem der häufigsten Verwechslungsfehler durch den Anwender schützt.

Dies kann bei ganzzahligen Divisionen in Ihrem Skript zu erheblichen Auswirkungen führen.

Python 2
				
					5/3=1 
				
			
Python 3
				
					5/3=1.6666... 
				
			

Unicode

In Python 2 musste bei einer Zeichenkette mit einem vorangestellten „u“ angegeben werden, ob diese in Unicode gespeichert werden soll.. In Python 3 werden Zeichenketten nun standardmäßig in Unicode gespeichert.

Python 2
				
					u“café” 
				
			
Python 3
				
					“café” 
				
			

Iterieren über einen Bereich

Zur Iteration über eine Objektmenge in einer Liste oder for-Schleife wird in Python 2 oftmals „xrange()verwendet. Dies ist sinnvoll bei einmaligen Operationen, kann aber bei mehrmaliger Wiederholung ineffizient werden, da der Bereich dabei immer wieder neu erzeugt wird.Außerdem ist keine Verwendung bei Funktionen möglich, die auf Listen angewendet werden. Daher erfolgte ein Ersatz durch „range()“, das ein Bereichsobjekt erzeugt, welches sich eher wie eine Liste verhält.

Python 2
				
					for x in xrange(): 
				
			
Python 3
				
					for x in range(): 
				
			

Iterieren über „dict“

Die Iteration über Wörterbuchschlüssel wurde an die Iteration über Listen angeglichen. „.iterkeys()“wird daher nicht mehr benötigt und Sie können stattdessen direkt über die Schlüssel iterieren. Zur Iteration über die Werte können Sie „.values()anstelle von „itervalues()“ verwenden.

Python 2
				
					for x in dict.iterkeys(): 
for x in dict.itervalues(): 
				
			
Python 3
				
					for x in dict: 
for x in dict.values(): 
				
			

Ausnahmen auslösen

Ausnahmen können ausgelöst werden, um den Anwender auf einen Fehler aufmerksam zu machen und dem Skript mitzuteilen, wie es im Falle eines Fehlers weiter verfahren soll. In Python 3 müssen diese Ausnahmen in Klammern gesetzt werden.

Python 2
				
					raise IOError, “file error” 
				
			
Python 3
				
					raise IOError(“file error”) 
				
			
Handhabung von Ausnahmen

„Try“ und „except“ werden verwendet, um den Code auf Fehler zu testen und diese entsprechend zu beheben. Mit dem „try“-Block können Sie einen Codebaustein auf Fehler testen und mit dem „except“-Block den Fehler anschließend beheben. Sie können in der Ausnahme die Ausführung einer bestimmten Aktion festlegen, wenn ein bestimmter Fehler auftritt. Die Syntax für die „except“-Anweisung muss in Python 3 jetzt ein „as“ enthalten.

Beispiel:

				
					try:  

print(x)  

except NameError as err:  

print("x is not defined")  

print(err) 

except:  

print("Something else")
				
			

Die Syntax der „except“-Zeile wurde so geändert, dass sie jetzt ein „as“ enthält und in diesem Beispiel zur folgenden Druckausgabe führt:

x is not defined

name ‚x‘ is not defined

Python 2
				
					except NameError, err: 

				
			
Python 3
				
					except NameError as err: 
				
			

Next()

Mit „Next“ können Sie das nächste Element in einem Iterator zurückgeben. In Python 2 konnte dies bisher mit „List.next()“ undnext(List)“ angegeben werden, in Python 3 ist nur noch die letztere Syntax möglich.

Python 2
				
					X=next(List) or 
X=List.next() 
				
			
Python 3
				
					X =next(List) 
				
			

Überlauf in den Namensraum

In Python 2 bestand die Möglichkeit, dass die in einer for-Schleifeverwendete iterierte Variable in den globalen Namensraum überlaufen konnte. Konkret heißt das, dass die Variable in der for-Schleife diesen Wert bei Verwendung desselben Variablennamens vor und nach der for-Schleife mit dem Endwert der Schleifenvariable überschreiben konnte.

Beispiel:

				
					variable = 0 
print 'before: variable =', variable 
print 'for-loop: ', [variable for variable in range(5)] 
print 'after: variable =', variable 
				
			
Python 2
				
					before: variable = 0 
for-loop:  [0, 1, 2, 3, 4] 
after: variable = 4 
				
			
Python 3
				
					before: variable = 0 
comprehension: [0, 1, 2, 3, 4] 
after: variable = 0 
				
			
  • Hast du eine Frage? Nimm Kontakt auf.
  • Hast du eine Frage? Nimm Kontakt auf.

TEILEN

Share on linkedin
Share on twitter
Share on email