What’s New In Python 3.1¶
- Author:
Raymond Hettinger
This article explains the new features in Python 3.1, compared to 3.0.Python 3.1 was released on June 27, 2009.
PEP 372: Ordered Dictionaries¶
Regular Python dictionaries iterate over key/value pairs in arbitrary order.Over the years, a number of authors have written alternative implementationsthat remember the order that the keys were originally inserted. Based onthe experiences from those implementations, a newcollections.OrderedDict class has been introduced.
The OrderedDict API is substantially the same as regular dictionariesbut will iterate over keys and values in a guaranteed order depending onwhen a key was first inserted. If a new entry overwrites an existing entry,the original insertion position is left unchanged. Deleting an entry andreinserting it will move it to the end.
The standard library now supports use of ordered dictionaries in severalmodules. Theconfigparser module uses them by default. This letsconfiguration files be read, modified, and then written back in their originalorder. The_asdict() method forcollections.namedtuple() nowreturns an ordered dictionary with the values appearing in the same order asthe underlying tuple indices. Thejson module is being built-out withanobject_pairs_hook to allow OrderedDicts to be built by the decoder.Support was also added for third-party tools likePyYAML.
See also
- PEP 372 - Ordered Dictionaries
PEP written by Armin Ronacher and Raymond Hettinger. Implementationwritten by Raymond Hettinger.
Since an ordered dictionary remembers its insertion order, it can be usedin conjunction with sorting to make a sorted dictionary:
>>># regular unsorted dictionary>>>d={'banana':3,'apple':4,'pear':1,'orange':2}>>># dictionary sorted by key>>>OrderedDict(sorted(d.items(),key=lambdat:t[0]))OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])>>># dictionary sorted by value>>>OrderedDict(sorted(d.items(),key=lambdat:t[1]))OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])>>># dictionary sorted by length of the key string>>>OrderedDict(sorted(d.items(),key=lambdat:len(t[0])))OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
The new sorted dictionaries maintain their sort order when entriesare deleted. But when new keys are added, the keys are appendedto the end and the sort is not maintained.
PEP 378: Format Specifier for Thousands Separator¶
The built-informat() function and thestr.format() method usea mini-language that now includes a simple, non-locale aware way to formata number with a thousands separator. That provides a way to humanize aprogram’s output, improving its professional appearance and readability:
>>>format(1234567,',d')'1,234,567'>>>format(1234567.89,',.2f')'1,234,567.89'>>>format(12345.6+8901234.12j,',f')'12,345.600000+8,901,234.120000j'>>>format(Decimal('1234567.89'),',f')'1,234,567.89'
The supported types areint,float,complexanddecimal.Decimal.
Discussions are underway about how to specify alternative separatorslike dots, spaces, apostrophes, or underscores. Locale-aware applicationsshould use the existingn format specifier which already has some supportfor thousands separators.
See also
- PEP 378 - Format Specifier for Thousands Separator
PEP written by Raymond Hettinger and implemented by Eric Smith andMark Dickinson.
Other Language Changes¶
Some smaller changes made to the core Python language are:
Directories and zip archives containing a
__main__.pyfile can now be executed directly by passing their name to theinterpreter. The directory/zipfile is automatically inserted as thefirst entry in sys.path. (Suggestion and initial patch by Andy Chu;revised patch by Phillip J. Eby and Nick Coghlan;bpo-1739468.)The
int()type gained abit_lengthmethod that returns thenumber of bits necessary to represent its argument in binary:>>>n=37>>>bin(37)'0b100101'>>>n.bit_length()6>>>n=2**123-1>>>n.bit_length()123>>>(n+1).bit_length()124
(Contributed by Fredrik Johansson, Victor Stinner, Raymond Hettinger,and Mark Dickinson;bpo-3439.)
The fields in
format()strings can now be automaticallynumbered:>>>'Sir{} of{}'.format('Gallahad','Camelot')'Sir Gallahad of Camelot'
Formerly, the string would have required numbered fields such as:
'Sir{0}of{1}'.(Contributed by Eric Smith;bpo-5237.)
The
string.maketrans()function is deprecated and is replaced by newstatic methods,bytes.maketrans()andbytearray.maketrans().This change solves the confusion around which types were supported by thestringmodule. Now,str,bytes, andbytearrayeach have their ownmaketrans andtranslatemethods with intermediate translation tables of the appropriate type.(Contributed by Georg Brandl;bpo-5675.)
The syntax of the
withstatement now allows multiple contextmanagers in a single statement:>>>withopen('mylog.txt')asinfile,open('a.out','w')asoutfile:...forlineininfile:...if'<critical>'inline:...outfile.write(line)
With the new syntax, the
contextlib.nested()function is no longerneeded and is now deprecated.(Contributed by Georg Brandl and Mattias Brändström;appspot issue 53094.)
round(x,n)now returns an integer ifx is an integer.Previously it returned a float:>>>round(1123,-2)1100
(Contributed by Mark Dickinson;bpo-4707.)
Python now uses David Gay’s algorithm for finding the shortest floating-pointrepresentation that doesn’t change its value. This should helpmitigate some of the confusion surrounding binary floating-pointnumbers.
The significance is easily seen with a number like
1.1which does nothave an exact equivalent in binary floating point. Since there is no exactequivalent, an expression likefloat('1.1')evaluates to the nearestrepresentable value which is0x1.199999999999ap+0in hex or1.100000000000000088817841970012523233890533447265625in decimal. Thatnearest value was and still is used in subsequent floating-pointcalculations.What is new is how the number gets displayed. Formerly, Python used asimple approach. The value of
repr(1.1)was computed asformat(1.1,'.17g')which evaluated to'1.1000000000000001'. The advantage ofusing 17 digits was that it relied on IEEE-754 guarantees to assure thateval(repr(1.1))would round-trip exactly to its original value. Thedisadvantage is that many people found the output to be confusing (mistakingintrinsic limitations of binary floating-point representation as being aproblem with Python itself).The new algorithm for
repr(1.1)is smarter and returns'1.1'.Effectively, it searches all equivalent string representations (ones thatget stored with the same underlying float value) and returns the shortestrepresentation.The new algorithm tends to emit cleaner representations when possible, butit does not change the underlying values. So, it is still the case that
1.1+2.2!=3.3even though the representations may suggest otherwise.The new algorithm depends on certain features in the underlying floating-pointimplementation. If the required features are not found, the oldalgorithm will continue to be used. Also, the text pickle protocolsassure cross-platform portability by using the old algorithm.
(Contributed by Eric Smith and Mark Dickinson;bpo-1580)
New, Improved, and Deprecated Modules¶
Added a
collections.Counterclass to support convenientcounting of unique items in a sequence or iterable:>>>Counter(['red','blue','red','green','blue','blue'])Counter({'blue': 3, 'red': 2, 'green': 1})
(Contributed by Raymond Hettinger;bpo-1696199.)
Added a new module,
tkinter.ttkfor access to the Tk themed widget set.The basic idea of ttk is to separate, to the extent possible, the codeimplementing a widget’s behavior from the code implementing its appearance.(Contributed by Guilherme Polo;bpo-2983.)
The
gzip.GzipFileandbz2.BZ2Fileclasses now supportthe context management protocol:>>># Automatically close file after writing>>>withgzip.GzipFile(filename,"wb")asf:...f.write(b"xxx")
(Contributed by Antoine Pitrou.)
The
decimalmodule now supports methods for creating adecimal object from a binaryfloat. The conversion isexact but can sometimes be surprising:>>>Decimal.from_float(1.1)Decimal('1.100000000000000088817841970012523233890533447265625')
The long decimal result shows the actual binary fraction beingstored for1.1. The fraction has many digits because1.1 cannotbe exactly represented in binary.
(Contributed by Raymond Hettinger and Mark Dickinson.)
The
itertoolsmodule grew two new functions. Theitertools.combinations_with_replacement()function is one offour for generating combinatorics including permutations and Cartesianproducts. Theitertools.compress()function mimics its namesakefrom APL. Also, the existingitertools.count()function now hasan optionalstep argument and can accept any type of countingsequence includingfractions.Fractionanddecimal.Decimal:>>>[p+qforp,qincombinations_with_replacement('LOVE',2)]['LL', 'LO', 'LV', 'LE', 'OO', 'OV', 'OE', 'VV', 'VE', 'EE']>>>list(compress(data=range(10),selectors=[0,0,1,1,0,1,0,1,0,0]))[2, 3, 5, 7]>>>c=count(start=Fraction(1,2),step=Fraction(1,6))>>>[next(c),next(c),next(c),next(c)][Fraction(1, 2), Fraction(2, 3), Fraction(5, 6), Fraction(1, 1)]
(Contributed by Raymond Hettinger.)
collections.namedtuple()now supports a keyword argumentrename which lets invalid fieldnames be automatically converted topositional names in the form _0, _1, etc. This is useful whenthe field names are being created by an external source such as aCSV header, SQL field list, or user input:>>>query=input()SELECT region, dept, count(*) FROM main GROUPBY region, dept>>>cursor.execute(query)>>>query_fields=[desc[0]fordescincursor.description]>>>UserQuery=namedtuple('UserQuery',query_fields,rename=True)>>>pprint.pprint([UserQuery(*row)forrowincursor])[UserQuery(region='South', dept='Shipping', _2=185), UserQuery(region='North', dept='Accounting', _2=37), UserQuery(region='West', dept='Sales', _2=419)]
(Contributed by Raymond Hettinger;bpo-1818.)
The
re.sub(),re.subn()andre.split()functions nowaccept a flags parameter.(Contributed by Gregory Smith.)
The
loggingmodule now implements a simplelogging.NullHandlerclass for applications that are not using logging but are callinglibrary code that does. Setting-up a null handler will suppressspurious warnings such as “No handlers could be found for logger foo”:>>>h=logging.NullHandler()>>>logging.getLogger("foo").addHandler(h)
(Contributed by Vinay Sajip;bpo-4384).
The
runpymodule which supports the-mcommand line switchnow supports the execution of packages by looking for and executinga__main__submodule when a package name is supplied.(Contributed by Andi Vajda;bpo-4195.)
The
pdbmodule can now access and display source code loaded viazipimport(or any other conformantPEP 302 loader).(Contributed by Alexander Belopolsky;bpo-4201.)
functools.partialobjects can now be pickled.
(Suggested by Antoine Pitrou and Jesse Noller. Implemented byJack Diederich;bpo-5228.)
Add
pydochelp topics for symbols so thathelp('@')works as expected in the interactive environment.(Contributed by David Laban;bpo-4739.)
The
unittestmodule now supports skipping individual tests or classesof tests. And it supports marking a test as an expected failure, a test thatis known to be broken, but shouldn’t be counted as a failure on aTestResult:classTestGizmo(unittest.TestCase):@unittest.skipUnless(sys.platform.startswith("win"),"requires Windows")deftest_gizmo_on_windows(self):...@unittest.expectedFailuredeftest_gimzo_without_required_library(self):...
Also, tests for exceptions have been builtout to work with context managersusing the
withstatement:deftest_division_by_zero(self):withself.assertRaises(ZeroDivisionError):x/0
In addition, several new assertion methods were added including
assertSetEqual(),assertDictEqual(),assertDictContainsSubset(),assertListEqual(),assertTupleEqual(),assertSequenceEqual(),assertRaisesRegexp(),assertIsNone(),andassertIsNotNone().(Contributed by Benjamin Peterson and Antoine Pitrou.)
The
iomodule has three new constants for theseek()method:SEEK_SET,SEEK_CUR, andSEEK_END.The
sys.version_infotuple is now a named tuple:>>>sys.version_infosys.version_info(major=3, minor=1, micro=0, releaselevel='alpha', serial=2)
(Contributed by Ross Light;bpo-4285.)
The
nntplibandimaplibmodules now support IPv6.The
picklemodule has been adapted for better interoperability withPython 2.x when used with protocol 2 or lower. The reorganization of thestandard library changed the formal reference for many objects. Forexample,__builtin__.setin Python 2 is calledbuiltins.setin Python3. This change confounded efforts to share data between different versions ofPython. But now when protocol 2 or lower is selected, the pickler willautomatically use the old Python 2 names for both loading and dumping. Thisremapping is turned-on by default but can be disabled with thefix_importsoption:>>>s={1,2,3}>>>pickle.dumps(s,protocol=0)b'c__builtin__\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'>>>pickle.dumps(s,protocol=0,fix_imports=False)b'cbuiltins\nset\np0\n((lp1\nL1L\naL2L\naL3L\natp2\nRp3\n.'
An unfortunate but unavoidable side-effect of this change is that protocol 2pickles produced by Python 3.1 won’t be readable with Python 3.0. The latestpickle protocol, protocol 3, should be used when migrating data betweenPython 3.x implementations, as it doesn’t attempt to remain compatible withPython 2.x.
(Contributed by Alexandre Vassalotti and Antoine Pitrou,bpo-6137.)
A new module,
importlibwas added. It provides a complete, portable,pure Python reference implementation of theimportstatement and itscounterpart, the__import__()function. It represents a substantialstep forward in documenting and defining the actions that take place duringimports.(Contributed by Brett Cannon.)
Optimizations¶
Major performance enhancements have been added:
The new I/O library (as defined inPEP 3116) was mostly written inPython and quickly proved to be a problematic bottleneck in Python 3.0.In Python 3.1, the I/O library has been entirely rewritten in C and is2 to 20 times faster depending on the task at hand. The pure Pythonversion is still available for experimentation purposes throughthe
_pyiomodule.(Contributed by Amaury Forgeot d’Arc and Antoine Pitrou.)
Added a heuristic so that tuples and dicts containing only untrackable objectsare not tracked by the garbage collector. This can reduce the size ofcollections and therefore the garbage collection overhead on long-runningprograms, depending on their particular use of datatypes.
(Contributed by Antoine Pitrou,bpo-4688.)
Enabling a configure option named
--with-computed-gotoson compilers that support it (notably: gcc, SunPro, icc), the bytecodeevaluation loop is compiled with a new dispatch mechanism which givesspeedups of up to 20%, depending on the system, the compiler, andthe benchmark.(Contributed by Antoine Pitrou along with a number of other participants,bpo-4753).
The decoding of UTF-8, UTF-16 and LATIN-1 is now two to four timesfaster.
(Contributed by Antoine Pitrou and Amaury Forgeot d’Arc,bpo-4868.)
The
jsonmodule now has a C extension to substantially improveits performance. In addition, the API was modified so that json worksonly withstr, not withbytes. That change makes themodule closely match theJSON specificationwhich is defined in terms of Unicode.(Contributed by Bob Ippolito and converted to Py3.1 by Antoine Pitrouand Benjamin Peterson;bpo-4136.)
Unpickling now interns the attribute names of pickled objects. This savesmemory and allows pickles to be smaller.
(Contributed by Jake McGuire and Antoine Pitrou;bpo-5084.)
IDLE¶
IDLE’s format menu now provides an option to strip trailing whitespacefrom a source file.
(Contributed by Roger D. Serwy;bpo-5150.)
Build and C API Changes¶
Changes to Python’s build process and to the C API include:
Integers are now stored internally either in base
2**15or in base2**30, the base being determined at build time. Previously, theywere always stored in base2**15. Using base2**30givessignificant performance improvements on 64-bit machines, butbenchmark results on 32-bit machines have been mixed. Therefore,the default is to use base2**30on 64-bit machines and base2**15on 32-bit machines; on Unix, there’s a new configure option--enable-big-digitsthat can be used to override this default.Apart from the performance improvements this change should be invisible toend users, with one exception: for testing and debugging purposes there’s anew
sys.int_infothat provides information about theinternal format, giving the number of bits per digit and the size in bytesof the C type used to store each digit:>>>importsys>>>sys.int_infosys.int_info(bits_per_digit=30, sizeof_digit=4)
(Contributed by Mark Dickinson;bpo-4258.)
The
PyLong_AsUnsignedLongLong()function now handles a negativepylong by raisingOverflowErrorinstead ofTypeError.(Contributed by Mark Dickinson and Lisandro Dalcrin;bpo-5175.)
Deprecated
PyNumber_Int(). UsePyNumber_Long()instead.(Contributed by Mark Dickinson;bpo-4910.)
Added a new
PyOS_string_to_double()function to replace thedeprecated functionsPyOS_ascii_strtod()andPyOS_ascii_atof().(Contributed by Mark Dickinson;bpo-5914.)
Added
PyCapsuleas a replacement for thePyCObjectAPI.The principal difference is that the new type has a well defined interfacefor passing typing safety information and a less complicated signaturefor calling a destructor. The old type had a problematic API and is nowdeprecated.(Contributed by Larry Hastings;bpo-5630.)
Porting to Python 3.1¶
This section lists previously described changes and other bugfixesthat may require changes to your code:
The new floating-point string representations can break existing doctests.For example:
defe():'''Compute the base of natural logarithms. >>> e() 2.7182818284590451 '''returnsum(1/math.factorial(x)forxinreversed(range(30)))doctest.testmod()**********************************************************************Failedexample:e()Expected:2.7182818284590451Got:2.718281828459045**********************************************************************
The automatic name remapping in the pickle module for protocol 2 or lower canmake Python 3.1 pickles unreadable in Python 3.0. One solution is to useprotocol 3. Another solution is to set thefix_imports option to
False.See the discussion above for more details.