Cambiar a Python 3

Nota técnica nº 59

Por Tessa Hayman

Mayo de 2021

En la última versión de Aimsun, introdujimos la opción de utilizar Aimsun Next con Python 3. . Sin embargo, hay algunas diferencias importantes que hay que tener en cuenta entre Python 2 y Python 3 cuando empieces a convertir tus modelos y guiones. Esta nota técnica cubrirá las diferencias clave y cómo Actualiza tu script de Python 2para que esté preparado para Python 3.

En enero de 2020, Python 2 alcanzó el estado de fin de vida, lo que significa que no recibirá más actualizaciones ni correcciones de errores y, lo que es más importante, no habrá correcciones de seguridad. Por tanto, te recomendamos que utilices Python 3 para todos los nuevos desarrollos. Gran parte del código de Python 3 en el software de Aimsun es utilizable también en Python 2. Sin embargo, puedes encontrar que tu antiguo script da errores cuando se utiliza con Python 3¡especialmente con respecto a las sentencias print!

Además de las declaraciones de impresión, es bueno que conozcas las principales diferencias para que puedas comprobar lo que hay que cambiar siquieres utilizar el mismo script o función de coste en varios modelos, ya que algunos cambios pueden modificar tu guión sin dar un error.

Print

El cambio más común que verás es con las sentencias print. En Python 3, la sentencia print debe ir entre paréntesis.

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

Integer division

En Python 2, cuando se dividían dos variables enteras, se generaba un valor entero. Sin embargo, en Python 3 esto se ha cambiado para que se dé un valor flotante como salida, lo que protege de un lugar común de confusión para los usuarios.

Esto podría tener un impacto significativo si tienes una división entera en tu script.

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

Unicode

En Python 2, tenías que especificar si una cadena debía almacenarse como Unicode utilizando “u” antes de la cadena. En Python 3, Unicode es ahora el método de almacenamiento por defecto de las cadenas

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

Iterar sobre un rango

xrange() se utiliza a menudo en Python 2 para iterar sobre un conjunto de objetos en una lista o conjunto en un bucle for. Es útil Es útil para operaciones puntuales, pero puede resultar ineficiente si se repite varias veces, ya que la generación del rango se repite. Tampoco puede utilizarse con funciones aplicadas a listas, por lo que se ha sustituido por range(), que genera un objeto rango que funciona más como una lista.

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

Iterate over dict

La iteración sobre las claves de un diccionario se ha adaptado para que sea igual que la iteración sobre una lista. Ya no es necesario utilizar .iterkeys() y en su lugar puedes iterar directamente sobre las claves. Para iterar sobre los valores, puedes utilizar .values() en lugar de itervalues().

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

Raise exceptions

Se pueden plantear excepciones para alertar al usuario de un error e indicar al script lo que debe hacer en caso de error. En Python 3 esta excepción debe ponerse entre paréntesis.

Python 2
				
					raise IOError, “file error” 
				
			
Python 3
				
					raise IOError(“file error”) 
				
			
Manejo de excepciones

Trata de exceptuar se utilizan para comprobar y tratar los errores del código. El bloque try te permite probar un bloque de código en busca de errores, mientras que el bloque except te permite manejar el error. Puedes especificar en la excepción que se realice una determinada acción si se produce un error nombrado. La sintaxis de la sentencia except se ha modificado en Python 3 para incluir “as”.

Por ejemplo

				
					try:  

print(x)  

except NameError as err:  

print("x is not defined")  

print(err) 

except:  

print("Something else")
				
			

La sintaxis de la línea except se ha modificado para incluir un “as” y este ejemplo imprimiría lo siguiente:

x no está definido

el nombre ‘x’ no está definido

Python 2
				
					except NameError, err: 

				
			
Python 3
				
					except NameError as err: 
				
			

Next()

Next te permite devolver el siguiente elemento de un iterador. Antes, en Python 2, se podía especificar mediante List.next() and next(List) pero en Python 3 sólo es posible esta última sintaxis.

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

Fugas en el espacio de nombres

En Python 2, era posible que la variable iterada utilizada en un for-loop se filtre al espacio de nombres global. O bien, si utilizas el mismo nombre de variable antes y después del bucle for, la variable del bucle for podría sobrescribir ese valor con el valor final de la variable en el bucle.

Por ejemplo

				
					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 
				
			
  • ¿Tienes alguna pregunta? Ponte en contacto.
  • ¿Tienes alguna pregunta? Ponte en contacto.

SHARE

Share on linkedin
Share on twitter
Share on email