Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Python 3.0: Where we break all your code
Search
Abhinav Sarkar
September 13, 2008
Programming
0
60
Python 3.0: Where we break all your code
Abhinav Sarkar
September 13, 2008
Tweet
Share
More Decks by Abhinav Sarkar
See All by Abhinav Sarkar
A Tiny Bytecode VM for Arithmetics in Haskell
abhin4v
0
91
Many Ways to Concur
abhin4v
0
980
Moving People with Clojure
abhin4v
1
430
Introduction to Concurrency in Haskell
abhin4v
0
1.3k
A Taste of Clojure
abhin4v
0
60
Other Decks in Programming
See All in Programming
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
640
リッチエディターを安全に開発・運用するために
unachang113
1
340
PHPUnitの限界をPlaywrightで補完するテストアプローチ
yuzneri
0
360
AIに安心して任せるためにTypeScriptで一意な型を作ろう
arfes0e2b3c
0
320
#QiitaBash TDDで(自分の)開発がどう変わったか
ryosukedtomita
1
340
DynamoDBは怖くない!〜テーブル設計の勘所とテスト戦略〜
hyamazaki
0
150
Google I/O Extended Incheon 2025 ~ What's new in Android development tools
pluu
1
220
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
900
MCP連携で加速するAI駆動開発/mcp integration accelerates ai-driven-development
bpstudy
0
240
「次に何を学べばいいか分からない」あなたへ──若手エンジニアのための学習地図
panda_program
3
700
[Codecon - 2025] Como não odiar seus testes
camilacampos
0
100
ご注文の差分はこちらですか? 〜 AWS CDK のいろいろな差分検出と安全なデプロイ
konokenj
4
730
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Faster Mobile Websites
deanohume
308
31k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
What's in a price? How to price your products and services
michaelherold
246
12k
Making Projects Easy
brettharned
117
6.3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
BBQ
matthewcrist
89
9.8k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
The Language of Interfaces
destraynor
158
25k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
730
Transcript
Python 3.0 where we break all your code Abhinav Sarkar
abhinav@abhinavsarkar.net abhinav.sarkar@gmail.com BARCAMP BANGALORE 7
introduction
xkcd#365
python 3.0 aka Python 3000 aka Py3k aka p3yk
where we break all your code
backwards incompatible
more precisely:
almost every program will need changes
almost every program will need changes
xkcd#349
justifications
Python is 16 years old
b/w compatibility is important
python: pre 1.0 lots of changes
1.0 -> 2.0 2.0 -> 2.6
no b/w incompatible changes
none important enough to give presentations on
annoying features
py3k is the chance to fix
mistakes duplications ugly things
mistakes coerce() backticks
duplication TIOOWTDI not true
map list comprehensions
string functions string methods
apply(foo, args, kwargs) foo(*args, **kwargs)
email package rfc822 modules
how did this happen?
ugly
`backticks` repr()
reduce() sum() replaces 95% of uses
print >> somefile, “stuff”
smaller language == better language
“python fits in your brain”
easier to learn easier to use
3.0
language changes
<> -> !=
`backticks` -> repr()
removed: print statement
!!
print() now a function
print a, b, c -> print(a, b, c)
print >> fp, “stuff” -> print(“stuff”, file=fp)
new print feature: customize separators
print “,”.join((a,b,c,d)) -> print(a,b,c,d, sep=“,”)
new string formatting
str.format() “name: {0} {1}”.format(first, last) fmt = “name: {first} {last}”
fmt.format(first=“abhinav”, last=“sarkar”)
format() builtin >>> format(3.0, “06.1f”) '0003.0'
new keywords: as True False None nonlocal
basic types
strings
unicode string default
but sometimes you want bytes network protocols binary files
bytes() bytes([0x0A, 0x0B, 0x42]) bytes(string, encoding)
new ascii() builtin and “%a” string format
non-ascii identifiers
numbers
no more long() ints are long by default no more
123L
integer division >>> 1/2 0.5
old style >>> 1//2 0
dicts
dictob.has_key(key) -> key in dictob
removed: dict.iter*
instead: dictionary views
for k in dict: for k,v in dict.items():
sets
set literals {1,2,3}
{} == dict() empty set: set()
set comprehensions
iterables
next() -> __next__()
new feature unpacking: first, *rest, last = list
head, *rest = somelist *ignore, tail = somelist
map(), filter(), zip() -> iterators
exceptions
no more string exceptions exceptions must derive from BaseException
2-arg raise raise MyExcp, val -> raise MyExcp(val)
3-arg raise raise MyExcp, val, tback -> raise MyExcp(val).with_traceback(tback)
except excp, e -> except excp as e
classes
new classes only as old-style classes
class A(object) -> class A()
class decorators @decorator class MyClass: pass
more more powerful metaclasses Abstract Base Classes (ABC) abstract methods
@abstractproperty
functions
keyword only args can't be positional
buggy example: def fun(arg1, arg2, flag=False): pass fun(1,2,3) # flag
= 3 ??
the change: keyword args after *args
def fun(arg1, arg2, *, flag=False): pass >>> fun(1,2,3) Traceback (most
recent call last): File “<stdin>”, line 1, in <module> TypeError: fun() takes exactly 2 positional arguments (3 given)
annotations
attaching metadata to arguments
syntax: def func(arg: expression)->returnValue: pass
expressions can be anything
documentation def doEvil(plan: “a plan”) -> “evil results”: .... types
def foo(a: float, b: int, c:list) -> dict: .... more complex def processFiles(*files: “one or more of filenames”, delete: “delete when done” = False) -> “a boolean”: ....
Python ignore annotations
stored in __annotations__
3rd party tools: optimizers, docs, IDEs, typechecking, ...
files
text vs binary text files must have encoding produce unicode
binary files produce bytestrings
new I/O layer raw I/O buffered I/O text I/O
modules
absolute imports
import foo always imports from the top level
import from same package: from . import foo
import from parent package: from .. import foo
stdlib
goals: PEP8 compliance some structure cleaning out cruft
PEP 0008 “Modules should have short, all-lowercase names.”
BaseHTTPServer cPickle cStringIO HTMLParser ....
either renamed, or Flushed.
structure
current structure
duplication and near duplications bsddb gdbm dbm dumbdbm
urllib vs urllib2
new packages: http html xmlrpc json dbm urllib
lots of renames: cStringIO -> io.StringIO SocketServer -> socketserver httplib
-> http.client urllib + urllib2 -> urllib
cruft
lots of purges: old email modules old hash modules old
platform modules
thread gone use threading
UserDict and friends -> subclass from dict
porting approach
take 2.5 code get working on 2.6 turn -3 flag
while True: run through 2to3 run unit tests under 3.0 fix 2.x code
2.x -> 2.6 -> 3.0
python 2.6 interim release -3 flag: turns on warnings from
__future__ from future_builtins import enables some backports
2to3 ships with 2.6, 3.0 does mechanical rewrites handles a
lot never going to be perfect
unit tests
eventually ... drop 2.x version switch to 3.0 version
things not in py3k
antigravity xkcd#353
case insensitivity death to lambda implicit self macros
not a complete rewrite
what happens to python 2.x?
None
2.x is not going away will continue to be supported
please try 3.0 betas
(and report bugs and send fixes)
References PEPs http://www.python.org/dev/peps/ http://www.python.org/dev/peps/pep-3100/ Anthony Baxter's OSCON'08 Talk http://www.interlink.com.au/anthony/tech/talks/OSCON2008/
exit()