切换到Python 3

技术注解 #59

作者:Tessa Hayman

2021年5月

Aimsun最新版本中,我们引入了AimsunNext带有Python 3 的选项使用 Next 20. 然而,需要注意Python 2和Python 3之间有一些重要的区别 当你开始转换你的模型和脚本时。 本技术说明将涵盖关键的差异以及如何做 update your Python 2 script to get it Python 3ready.  更新Python 2脚本,让它为Python 3做好准备。

2020年1月,Python 2,意味着它将不再收到更新和错误 修复更重要的没有安全修复。因此我们建议你使用Pyson 3处理所有新的开发。许多Python 3代码Aimsun 软件 不可用于Python 2。 但是,你 可能会发现你的旧脚本给出错误,在使用Python 3的时候 – 特别是在打印语句方面!

在打印语句之外,留意主要的差别,因而你可以检查什么需要改变,如果你希望用同样的脚本或成本函数在多重模型上面,因为一些改变可能会改变你的脚本而不会给出错误信息。

打印

你会看到的最常见的变化是打印语句。 在Python 3中,打印语句应该放在括号里。.

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

整数除法

在Python 2中,当两个整数变量相除时,将产生一个整数值。 然而,在Python 3中,这一点已经被改变,一个浮动值给出 作为输出, 这常常导致用户的一个共同混淆之处。

如果你的脚本中有整数除法,这可能有很大的影响。

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

统一码

在Python 2中,你必须使用 “u “来指定一个字符串是否被存储为Unicode,在字符串前。. 在Python 3中,统一码现在是字符串的默认存储方式。

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

在一个范围内进行迭代

xrange() 在Python 2中经常被用来在for-loop中迭代一个列表或集合中的对象。 这是 有用一次性操作来讲,但是可能成为不充分的,如果其重复多次,因为该范围的生成是重复的。它也不能与应用于列表的函数一起使用。因此它已经被rang()代, 这可生成一个范围对象,它的工作方式更像一个列表。

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

对dict的迭代

I对dictionary的keys的迭代已经被调整为与一个列表的迭代相同。.iterkeys()不再被需要,而你可以直接迭代keys。对values的迭代,你可以.values()而不是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

Exceptions可以被“raised”来提醒用户注意错误,并告诉脚本在出现错误时该怎么做。 在Python 3,这个“exception”必须放进括号里。

Python 2
				
					raise IOError, “file error” 
				
			
Python 3
				
					raise IOError(“file error”) 
				
			
处理exceptions

“Try”和“except” 被用来测试和处理代码的错误。 Try block允许你测试一块代码是否有错而except block 让你处理错误。 如果一个命名的错误被”raised”,你可以在”except”里指定一个行动。 在Python 3中,except语句的语法已经被改变,包括 “as”。

例如,

				
					try:  

print(x)  

except NameError as err:  

print("x is not defined")  

print(err) 

except:  

print("Something else")
				
			

“except”行的语法已被改变,包括一个 “as” 这个例子将打印出以下内容:

x is not defined

name ‘x’ is not defined

Python 2
				
					except NameError, err: 

				
			
Python 3
				
					except NameError as err: 
				
			

Next()

“Next” 允许你返回一个迭代器中的”next”项。 以前在Python 2中,可以用以下方法指定 List.next()next(List) 但在Python 3中,只有后一种语法可以使用。

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

Namespace泄露

在Python 2中,可以将用在for-loop中的迭代变量泄露到全局namespace。 或者说,如果你在for-loop前后使用相同的变量名,for-loop变量可能会覆盖该值, 以循环中的变量的最终值。

例如,

				
					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 
				
			

更多技术说明

混合仿真

2018年2月:Geline Canayon和Laura Torres为您简要介绍了如何、什么时候、在哪里和为什么做混合仿真。

Learn more »
  • 有问题吗? 请联系我们。

    我们在这里提供帮助!

  • 有问题吗? 请联系我们。

    我们在这里提供帮助!

分享