"The syntax issues are trivial, as they trigger at compile time... The issue is with the changes that only trigger when you execute the code, like bytestreams returned instead of strings when using popen.communicate(), or dividing int numbers now returning fractional values, unicode/string handling way stricter, etc... you dont know its broken till the code happens to take that execution branch, and even then it might fail silently as its not an error, but a semantic difference.
That being said, the most annoying are all the module name casing changes. Why? Whats the purpose of that? Breaking all the existing python code in the world just so one guy who had severe OCD on the python commitee can rest a bit easier somewhere?"
"ConfigParser -> configparser, FlagLogger -> flaglogger for example.
Also, the reorganization of the urllib, htplib etc libraries to sub libraries (parse, request etc). Or the change that filter/map/range/etc now return iterators, which are object instances even when empty. So any code that did stuff like:
myList = filter( ... )
if myList:
do_something( myList[0] )
will now fail. Or worse, it will silently fail cause myList is now 'true' even for empties. "
production stories --
"The syntax issues are trivial, as they trigger at compile time... The issue is with the changes that only trigger when you execute the code, like bytestreams returned instead of strings when using popen.communicate(), or dividing int numbers now returning fractional values, unicode/string handling way stricter, etc... you dont know its broken till the code happens to take that execution branch, and even then it might fail silently as its not an error, but a semantic difference. That being said, the most annoying are all the module name casing changes. Why? Whats the purpose of that? Breaking all the existing python code in the world just so one guy who had severe OCD on the python commitee can rest a bit easier somewhere?"
"ConfigParser -> configparser, FlagLogger -> flaglogger for example. Also, the reorganization of the urllib, htplib etc libraries to sub libraries (parse, request etc). Or the change that filter/map/range/etc now return iterators, which are object instances even when empty. So any code that did stuff like: myList = filter( ... ) if myList: do_something( myList[0] ) will now fail. Or worse, it will silently fail cause myList is now 'true' even for empties. "