Download PyCon 2007 - Python 3000

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Python 3000
(PyCon, 24-Feb-02007)
Guido van Rossum
[email protected]
[email protected]
What Is Python 3000?
• The next major Python release
– To be released as Python 3.0
• The first one in a long time to be incompatible
– But not completely different or unusual
• Concept first formed around 2000
– Py3k nickname was a play on Windows 2000
• Goal: to correct my early design mistakes
– Those that would require incompatibility to fix
– Reduce cognitive load for first-time learners
• Work and thinking started for real last year
24 Feb 02007
(c) 2007 Python Software Foundation
2
Activity Since Last Year
• Lots of design discussions
– (too many, if you ask me :-)
• Some PEPs were written
– (but not enough…)
• Lots of code was written
– (just the right amount!)
– (but we're not done yet!!)
24 Feb 02007
(c) 2007 Python Software Foundation
3
Python 3.0 Timeline
• PEPs to be completed: April 2007
• 3.0a1: June 2007
• 3.0 final: June 2008
For comparison, the 2.6 timeline:
• 2.6a1: December 2007
• 2.6 final: April 2008
There will also be a 2.7 timeline
24 Feb 02007
(c) 2007 Python Software Foundation
4
Rest of the Talk
• Highlight some of the most visible changes
– print function, dict views, comparisons, unicode, …
• How to convert 2.x to 3.0 code
• Notational convention:
* = incompletely implemented
** = not yet implemented
24 Feb 02007
(c) 2007 Python Software Foundation
5
No More Classic Classes
• In 2.2 … 2.9:
– class C:
– class C(object):
# classic class (0.1 … 2.1)
# new-style class (old now :-)
• In 3.0:
– both are new-style classes (just say "classes")
• Differences are subtle, few of you will notice
24 Feb 02007
(c) 2007 Python Software Foundation
6
Print is a Function
• print x, y
• print x,
• print >>f, x
-> print(x, y)
-> print(x, end=" ")
-> print(x, file=f)
• Automatic translation is 98% correct
• Fails for cases involving softspace cleverness:
– print "x\n", "y" doesn 't insert a space before y
– print("x\n", "y") does
– ditto for print "x\t", "y"
24 Feb 02007
(c) 2007 Python Software Foundation
7
Dictionary Views
•
•
•
•
Inspired by Java Collections Framework
Remove .iterkeys(), .iteritems(), .itervalues()
Change .keys(), .items(), .values()
These return a dict view
–
–
–
–
Not an iterator
A lightweight object that can be iterated repeatedly
.keys(), .items() have set semantics
.values() has "collection" semantics
• supports iteration and not much else
24 Feb 02007
(c) 2007 Python Software Foundation
8
Default Comparison Changed
• Default ==, != compare object identity
– (this is unchanged)
• Default <, <=, >, >= raise TypeError
• Example: [1, 2, ""].sort() raises TypeError
• Rationale: 2.x default ordering is bogus
– depends on type names
– depends on addresses
24 Feb 02007
(c) 2007 Python Software Foundation
9
**Unicode Strings
• Java-like model:
– strings (the str type) are always Unicode
– separate bytes type
– must explicitly specify encoding to go between these
• Open issues:
– implementation
• fixed-width characters for O(1) indexing
• maybe 3 internal widths: 1, 2, 4 byte characters
• C API issues (many C APIs use C char* pointers)
– optimize slicing and concatenation???
• lots of issues, supporters, detractors
24 Feb 02007
(c) 2007 Python Software Foundation
10
The Bytes Type
• A mutable sequence of small ints (0…255)
– b[0] is an int; b[:1] is a new bytes object
• Implemented efficiently as unsigned char[]
• Has some list-like methods, e.g. .extend()
• Has some string-like methods, e.g. .find()
– But none that depend on locale
• bytes literals: b"ascii or \xDD or \012"
• bytes has .decode() method returning a string
• str has a .encode() method returning bytes
24 Feb 02007
(c) 2007 Python Software Foundation
11
**New I/O Library
• Stackable components (inspired by Java, Perl)
– Lowest level: unbuffered byte I/O
• platform-specific; don't use C stdio
– Add buffering
– Add unicode encoding/decoding
• encoding explicitly specified or somehow guessed
– Add CRLF/LF mapping
• Compatible API
– open(filename) returns a buffered text file
• read() and readline() return strings
– open(filename, "b") returns a buffered binary file
• read() returns bytes; can't use readline()
24 Feb 02007
(c) 2007 Python Software Foundation
12
Int/Long Unification
• There is only one built-in integer type
• Its name is int
• Its implementation is like long in Python 2.x
• C API is a bit murky
• Performance could use a boost
24 Feb 02007
(c) 2007 Python Software Foundation
13
Int Division Returns a Float
• Always!
• Same effect in 2.x with
– from __future__ import division
• Use // for int division
• Use -Q option to Python 2.x to find old usage
24 Feb 02007
(c) 2007 Python Software Foundation
14
**Raise and Except Changes
• All exceptions must derive from BaseException
• Exceptions have __traceback__ attribute
• Must use raise E(arg) instead of raise E, arg
• Can still use raise E and raise without args
• Use raise E(arg).with_traceback(tb)
– instead of raise E, arg, tb
• Use "except E as v:" instead of "except E, v:"
• Variable v is deleted at end of except block!!!
24 Feb 02007
(c) 2007 Python Software Foundation
15
Signature Annotations
• NOT type declarations!
• Example:
– def foo(x: "whatever", y: list(range(3))) -> 42*2: …
• Argument syntax is (roughly):
– NAME [':' expr] ['=' expr]
• Both expressions are evaluated at 'def' time
– foo.func_annotations is:
• {'a': "whatever", 'b': [0, 1, 2], "return": 84}
– NO other use is made of these annotations
24 Feb 02007
(c) 2007 Python Software Foundation
16
Keyword-Only Parameters
• Example def:
– def foo(a, b=1, *, c=42, d): …
• Example call:
– foo(1, 2, d=3)
• Cannot use:
– foo(1, 2, 3) # raises TypeError
24 Feb 02007
(c) 2007 Python Software Foundation
17
Set Literals
• {1, 2, 3} is the same as set([1, 2, 3])
• No empty set literal; use set()
• No frozenset literal; use frozenset({…})
• **Set comprehensions:
– {f(x) for x in S if P(x)}
• same as set(f(x) for x in S if P(x))
24 Feb 02007
(c) 2007 Python Software Foundation
18
Absolute Import
• Same effect in 2.5 with
– from __future__ import absolute_import
• Within a package "import foo" does NOT
search the package path, only sys.path
• Use "from . import foo" for relative import
• Or use from <full-package-name> import foo
24 Feb 02007
(c) 2007 Python Software Foundation
19
**String Formatting
• Examples (see PEP 3101 for more):
– "See {0}, {1} and {foo}".format("A", "B", foo="C")
• "See A, B and C"
– "my name is {0} :-{{}}".format("Fred")
• "my name is Fred :-{}"
– "File name {0.foo}".format(open("foo.txt"))
• File name foo.txt
– "Name is {0[name]}".format({"name": "Fred"})
• "Name is Fred"
– Shoe size {0:8}".format(42)
• "Shoe size
24 Feb 02007
42"
(c) 2007 Python Software Foundation
20
**Nonlocal Statement
• def outer():
x = 42
def inner():
nonlocal x
# <---- new
print(x)
x += 1
return inner
• Doesn't work today; x becomes a local in inner
• Different keywords proposed:
– nonlocal, global, outer, … (see PEP 3104)
24 Feb 02007
(c) 2007 Python Software Foundation
21
**Abstract Base Classes?
• Still highly speculative (no PEP yet)
– wiki.python.org/moin/AbstractBaseClasses
• Introduce a standard abstract class hierarchy
for type categories like file, container,
sequence, iterable etc.
• Standard types to use these as base classes
• User-defined types may use these
• When used, can help distinguishing e.g.
sequence from mapping, or file-like behavior,
or "stringiness", or "numericity", etc.
24 Feb 02007
(c) 2007 Python Software Foundation
22
**Switch/Case Statement???
• Highly speculative; see PEP 3103
– switch EXPR:
case EXPR:
SUITE
case EXPR:
SUITE
…
[else:
SUITE]
# or case in EXPRLIST:
• Problem: when to compile EXPR?
– Would prefer precompilation for faster execution
– But this would introduce unusual semantics
24 Feb 02007
(c) 2007 Python Software Foundation
23
Miscellaneous Changes
•
•
•
•
•
•
•
exec becomes a function again
range() becomes xrange()
input() becomes raw_input()
zip() returns an iterator
Moved intern() into sys module
Renamed __nonzero__ to __bool__
'as' and 'with' are keywords
• And more, planned and implemented
24 Feb 02007
(c) 2007 Python Software Foundation
24
Miscellaneous Removals
•
•
•
•
•
•
•
classic classes: new-style classes default
backticks: use repr()
Removed <>: use !=
apply(): use func(*args)
coerce(), __coerce__: not needed
dict.has_key(): use key in dict
'softspace' attribute on file objects
24 Feb 02007
(c) 2007 Python Software Foundation
25
**Library Reform
•
•
•
•
Not my priority
Others are interested, but effort seems stalled
Need help!
May happen after 3.0a1 is released
24 Feb 02007
(c) 2007 Python Software Foundation
26
*C API Changes
• Too early to tell what will happen
• 3rd party extension authors want to know
• For now, these simple rules:
– Adding APIs is okay (of course)
– Deleting APIs is okay
– Changing APIs incompatibly is NOT OKAY
24 Feb 02007
(c) 2007 Python Software Foundation
27
Converting 2.x Code to 3.0
• Generic conversion tool exists
– sandbox/2to3
– accurate source-to-source transformation
– parse tree decorated with whitespace & comments
• New conversions are easily added
– create a class from boilerplate
– add a class variable PATTERN to match nodes
– add a method transform() to transform one node
• Separately, Python 2.6 will help
– can warn about out-of-date usages
– can provide forward-compatible alternatives
24 Feb 02007
(c) 2007 Python Software Foundation
28
Examples of What It Can Do
•
•
•
•
•
•
•
•
•
apply(fun, args, kwds) -> fun(*args, **kwds)
d.iterkeys() -> d.keys()
exec a in b, c -> exec(a, b, c)
print >>sys.stderr, x, ->
print(x, end=" ", file=sys.stderr)
except E, v: -> except E as v:
d.has_key(k) -> k in d
intern(s) -> sys.intern(s)
a <> b -> a != b; `x` -> repr(x); int -> long
automatically adds parentheses where needed
24 Feb 02007
(c) 2007 Python Software Foundation
29
Examples of What It Can't Do
•
•
•
•
•
•
•
detect whether d is a dict (in d.iterkeys())
detect whether you use d.keys() as a list later
turn int()/int() into int()//int()
fix code that depends on int() < str()
remove redundant code
fix custom classes emulating dictionaries
fix string exceptions, non-Exception
exceptions
• in general: limited to syntactic conversions
– can't follow control flow, doesn't do type inference
24 Feb 02007
(c) 2007 Python Software Foundation
30
What You Can Do Today
• Don't worry about stuff that can be automated
• Don't try to write source-level compatible code
–
–
–
–
–
–
–
Use Python 2.6 when it comes out
Write unit tests with maximal coverage
Use keys = sorted(d.iterkeys())
Use list(d.iterkeys()) when you really need a list
Derive all exceptions from Exception
Derive all classes from object
Don't rely on subtle print/softspace semantics
• use print line.rstrip("\n") instead of print line,
– Use // for int division
24 Feb 02007
(c) 2007 Python Software Foundation
31
Questions