python3 @ linuxtage 2010

58
3 Armin Ronacher http://lucumr.pocoo.org / // [email protected] // http://twitter.com/mitsuhiko

Upload: armin-ronacher

Post on 06-May-2015

1.574 views

Category:

Technology


3 download

DESCRIPTION

Getting started with Python 3 coming from Python 2. How to port your libraries.

TRANSCRIPT

Page 2: Python3 @ Linuxtage 2010

•using Python since version 2.2

•not-a-committer-with-commit-rights!?

•Part of the Pocoo Team: Jinja, Werkzeug, Sphinx, Zine, Flask

About Me

Page 3: Python3 @ Linuxtage 2010

A little bit of History

Page 4: Python3 @ Linuxtage 2010

1991Python Appears

‣ Exceptions

‣ Multiple Inheritance

‣ C inspired IO system

Page 5: Python3 @ Linuxtage 2010

Python 1.5

1995

‣ Regular Expressions

‣ Exceptions are Classes

‣ Built in Package Support

‣ It can be embedded!

Page 6: Python3 @ Linuxtage 2010

2000Python 2.0!

‣ Unicode Support

‣ Augmented assignments (+=, -= etc.)

‣ List Comprehensions

‣ Garbage Collector

‣ Python Enhancement Proposals!

Spoiler: this is where it gets interesting

Footnote: some of this was in 1.6 already

Page 7: Python3 @ Linuxtage 2010

2004Python 2.4!

‣ Source Encoding

‣ Boolean Type (True/False)

‣ sets

‣ reverse iteration

‣ generator expressions

Spoiler: unicode becomes interesting

Footnote: some of this was in 2.3 already

Page 8: Python3 @ Linuxtage 2010

Not all is Fine

Page 9: Python3 @ Linuxtage 2010

It’s bytes — it’s charpoints

String Coercion

!!!!"!#!$%&'&($!!!!)!#!*$+,()&-$!!!!$."--/!$!0!"1."--/!%&'&(1

!!!!$."--/!$!0!)*1."--/!+23&4()&-1

!!!!5(67'!8."--/!+,()&-

Page 10: Python3 @ Linuxtage 2010

It’s an exception

String Coercion [fail]

!!!!"!#!*$%&'&($!!!!)!#!$+,()&-$"#$%&'$%()9:/;'!(&<&7'!<"--!-";'=*))>>>+,-%./&0&%./&1##.#*)?6))&(6;@

Page 11: Python3 @ Linuxtage 2010

why is that?

Print is a Statement

!!!!5(67'!$.&--/$A!4B.&--/!4B

!!!!5(67'9$.&--/$A!4B=91.&--/1A!4B=

!!!!3!#!5(67'"#$%&'$%()9:/;'!(&<&7'!<"--!-";'=*))>>>23,4$51##.#*)67C"-6D!;E7'"3

Page 12: Python3 @ Linuxtage 2010

… and I want my place

O HAI — IM TEH ITERATOR

!!!!"!#!F1G//1H!IA!1)"(1H!BJ!!!!">K&E;9=L1G//1A!1)"(1M

!!!!">6'&(K&E;9=ND6<'6/7"(EOK&E6'&("'/(!/)P&<'!>>>Q

Page 13: Python3 @ Linuxtage 2010

let’s do some guessing

Exceptions

#$-6&!"#$-6&!"A!)A!<#$-6&!99"A!)=A!<=A!D&5%&74!RH&5%&74!RA!+H&5%&74!9RA!+=A!SH

Page 14: Python3 @ Linuxtage 2010

that should clear it up:

Exceptions improved

#$-6&!"#$-6&!)>T6'@8'("<&)"<K9<=#$-6&!99"A!)=A!<=A!D&5%&74!RH&5%&74!R!$6!+H&5%&74!9RA!+=!$6!SH

Page 15: Python3 @ Linuxtage 2010

New Stuff in 3.x

Page 16: Python3 @ Linuxtage 2010

Re-bind variables from outer scopes:

non-local names

/&8!:"K&8</*7'&(9676'6"-#U=H!!!!C"-!#!676'6"-

!!!!/&8!67<9=H!!!!!!!!,.,9.%$9!C"-!!!!!!!!(C!#!C"-

!!!!!!!!C"-!0#!I

!!!!!!!!#&4:#,!(C!!!!#&4:#,!67<

Page 17: Python3 @ Linuxtage 2010

Set Literal

New Literals

!!!!"!#!FIA!BA!VJ!!!!)!#!;&'9=

Footnote: there is no literal for an empty set

Page 18: Python3 @ Linuxtage 2010

Unpack in variables

Extended Unpacking

!!!!G6(;'A!;&</7DA!W(&;'!#!*75"<K9=

Footnote: The rest is a list with all the unassigned items

Page 19: Python3 @ Linuxtage 2010

Duck Typing Improved

Abstract Base Classes

!!!!%9$66!XEY'&("'/(9/)P&<'=H;;;!!!!/&8!887&3'889;&-G=H;;;!!!!!!!!#$-6&!Z'/5Y'&("'6/79=;;;!!!!/&8!886'&(889;&-G=H;;;!!!!!!!!#&4:#,!;&-G;;;!!!!8#.<!</--&<'6/7;!-<7.#4!Y'&("'/(!!!!6;67;'"7<&9XEY'&("'/(9=A!Y'&("'/(=[(*&

Footnote: Implicit subclasses, awesome!

Page 20: Python3 @ Linuxtage 2010

Add type information to your signatures

Annotations!

8#.<!7*:)&(;!-<7.#4!\*:)&(

/&8!"DD9"H!\*:)&(A!)H!\*:)&(=!OQ!\*:)&(!!!!#&4:#,!"!0!)

Footnote: These are unchecked, Sphinx can use them

Page 21: Python3 @ Linuxtage 2010

print a function, super with magic

Goodies

!!!!"!#!5(67'!!!!"94B=4B

!!!!%9$66!["?Z&'9;&'=H;;;!!!!!/&8!"DD9;&-GA!'"?=H;;;!!!!!!!!!;*5&(9=>"DD9'"?>-/T&(9==;;;!!!!'E5&9675*'9==.&--/!]/(-D^

N'E5&!_;'(`Q

Brrr: How does super() work? You don’t wanna know

Page 22: Python3 @ Linuxtage 2010

New Land

Page 23: Python3 @ Linuxtage 2010

be courageous

Backwards Incompatible

‣ Break up with the Past

‣ Fix the issues

‣ Help the transition with automation

Page 24: Python3 @ Linuxtage 2010

how can we do that?

Side By Side

‣ Python 3.x and Python 2.x are developed side by side

‣ Python 2.x slowly adopts features that come from 3.x or make the automated conversion easier

Page 25: Python3 @ Linuxtage 2010

2to3 for the rescue

Automation

‣ A tool to convert from Python 2.x sources to 3.x

‣ Operates on the parsing-time information only.

‣ Not 100% correct, but close

Page 26: Python3 @ Linuxtage 2010

There Be Dragons

Page 27: Python3 @ Linuxtage 2010

Library or Application?

Step by Step

‣ 2to3 caters for both

‣ But the experience differs

‣ generally: application easier

#1

Page 28: Python3 @ Linuxtage 2010

Unicode or Bytes?

Step by Step

‣ did your API use bytes?

‣ did it use unicode?

‣ what should it use now?

#2

Page 29: Python3 @ Linuxtage 2010

Are you sure?

Step by Step

‣ Beware of the stdlib

‣ things unicodified along the way

‣ explicit encoding!

#3

Page 30: Python3 @ Linuxtage 2010

Adapt to new idioms

Step by Step

‣ str.format instead of %

‣ keys() and not iterkeys(), beware on custom classes

‣ abstract base classes

‣ the new IO system

#4

Page 31: Python3 @ Linuxtage 2010

Port your Tests

Step by Step

‣ Make sure the tests run on 3.x

‣ Get rid of your doctests. Now!

‣ make sure 2to3 only has to correct syntax, not semantics. Runtime checks.

#5

Page 32: Python3 @ Linuxtage 2010

2to3 will byte you

Page 33: Python3 @ Linuxtage 2010

Affects many 2.x libraries

Unicode Breakage

‣ class implements ==:,-%./&==

‣ and ==64#== calls into ==:,-%./&==

‣ on 3.x: RuntimeError

‣ Can be fixed with a custom fixer

Page 34: Python3 @ Linuxtage 2010

If everything else fails …

Preprocessing

‣ write a preprocessor

‣ monkey-patch yourself in

Footnote: that’s what SQLAlchemy does

-8!;E;>C&(;6/7867G/!Q#!9VA!U=H!!!!8#.<!5(&5(/<&;;/(!-<7.#4!(&G"<'/(8;'(67?!!!!8#.<!-6)B'/V>(&G"<'/(!-<7.#4!a&G"<'/(67?[//-!!!!a&G"<'/(67?[//->(&G"<'/(8;'(67?!#!(&G"<'/(8;'(67?

Page 35: Python3 @ Linuxtage 2010

What if you depend on something?

Changing Protocols

‣ WSGI changes and is broken right now

‣ web applications are an unrealistic target for the time being.

Rejoice: WSGI 1.1 is coming around

Page 36: Python3 @ Linuxtage 2010

Fixing with Fixers

Page 37: Python3 @ Linuxtage 2010

2to3 does not work at runtime

What are Fixers?

‣ 2to3 is guessing

‣ has certain assumptions of your code

‣ fixers operate on a parse tree

‣ fixers can refactor and modify code

Page 38: Python3 @ Linuxtage 2010

A fixer to rename functions

Anatomy of a Fixer

8#.<!-6)B'/V!-<7.#4!G63&(8)";&8#.<!-6)B'/V>G63&(8*'6-!-<7.#4!\":&A!+-"7Kb67&

%9$66!c63R-'d76</D&9!"#$%&'()$*+()$,"#=H!!!!%R[[ea\!#!$$$

!!!!G*7<#G*7<D&GN!1D&G1!7":&#188*76</D&881

!!!!!!!!!!!!!!!!!!5"(":&'&(;N!191!\RXe!1=1!Q!"7E0!Q

!!!!$$$

!!!!/&8!'("7;G/(:9)$-!A!7/D&A!(&;*-';=H!!!!!!!!7":&!#!(&;*-';L17":&1M

!!!!!!!!7":&>(&5-"<&9\":&9188;'(881A!5(&G63#7":&>5(&G63==

Page 39: Python3 @ Linuxtage 2010

use distribute!

Running custom Fixers

distribute: http://pypi.python.org/pypi/distribute

‣ distribute replaces setuptools

‣ has builtin 2to3 support

‣ the distribution system for 3.x

Page 40: Python3 @ Linuxtage 2010
Page 41: Python3 @ Linuxtage 2010

add this to your setup.py

Hook into distribute

&3'("!#!FJ

-8!;E;>C&(;6/7867G/!Q#!9VA!U=H!!!!&3'(">*5D"'&9

!!!!!!!!*;&8B'/V#[(*&A

!!!!!!!!*;&8B'/V8G63&(;#L1<*;'/:8G63&(;1M

!!!!=

;&'*59>>>A!WW&3'("=

distribute: http://pypi.python.org/pypi/distribute

Page 42: Python3 @ Linuxtage 2010
Page 43: Python3 @ Linuxtage 2010
Page 44: Python3 @ Linuxtage 2010

What is it?

Porting Jinja2

‣ Jinja2 — a template engine

‣ Codebase: 10KLOC

‣ In 2.x unicode based

Page 45: Python3 @ Linuxtage 2010

Porting Experience?

Porting Jinja2

‣ # custom fixers: 3

‣ preprocessing? nope

‣ passing tests? all! (except for doctests in the documentation)

Page 46: Python3 @ Linuxtage 2010

An Example Fixer

Porting Jinja2

8#.<!-6)B'/V!-<7.#4!G63&(8)";&A!5E'(&&8#.<!-6)B'/V>G63&(8*'6-!-<7.#4!\":&A!+-"7Kb67&A!\":&A!R''(A!R(?b6;'

%9$66!c63+(/K&7a&("6;67?9!"#$%&'()$*+()$,"#=H!!!!%R[[ea\!#!$$$

!!!!("6;&8;':'N!1("6;&1!"7E!1A1!C"-#"7E!1A1!')#"7E!Q

!!!!$$$

!!!!f!(*7!)&G/(&!'@&!)(/K&7!B'/V!<@&<K&(!T6'@!'@&!;":&!?/"-

!!!!f!'(6&;!'/!(&T(6'&!6'!T6'@!"!(*-&!'@"'!D/&;!7/'!T/(K!/*'!G/(!P67P"

!!!!(*78/(D&(!#!I

!!!!/&8!'("7;G/(:9)$-!A!7/D&A!(&;*-';=H!!!!!!!!')!#!(&;*-';L1')1M><-/7&9=

!!!!!!!!')>5(&G63!#!11

!!!!!!!!T6'@8')!#!R''(9(&;*-';L1C"-1M><-/7&9=A!\":&91T6'@8'("<&)"<K1==!0!2

!!!!!!!!!!!!!!!!!!LR(?b6;'9L')M=M

!!!!!!!!7&T!#!5E'(&&>\/D&9;&-G>;E:;>;6:5-&8;':'A!L\":&91("6;&1=M!0!T6'@8')=

!!!!!!!!7&T>5(&G63!#!7/D&>5(&G63

!!!!!!!!#&4:#,!7&T

Page 47: Python3 @ Linuxtage 2010

Recipe

1) port doctests to unittest or your test suite

2) decide on your API for Python 3

3) check if 2to3 works on the tests

4) make the tests work

5) run 2to3 on your own code

6) add runtime fixes or custom fixers

follow these steps for enlightenment

Page 48: Python3 @ Linuxtage 2010

Unladen Swallow

Page 49: Python3 @ Linuxtage 2010

Unladen Swallow

Making Python Fast

1) LLVM JIT based

2) a development branch of Python

3) currently targeting 2.x, but major changes will land in 3.x

Page 50: Python3 @ Linuxtage 2010

Current Status

0

17.5

35

52.5

70

Python 2.5 Python 2.6 US Q1 US Q2

Pystones Plurk Profile

Numbers

Page 51: Python3 @ Linuxtage 2010

Not very impressive

1) It’s not there yet

2) There will be a development branch

3) Python is hard to optimize, will take some time

Current Status

Page 52: Python3 @ Linuxtage 2010

Ported Libraries

Page 53: Python3 @ Linuxtage 2010

Ported LibrariesWeb Related Libraries

‣ Jinja2

‣ Mako

‣ lxml

‣ SQLAlchemy

‣ httplib2

Page 54: Python3 @ Linuxtage 2010

Ported LibrariesGeneral Purpose

‣ blinker

‣ Pygments

‣ PyYAML

‣ tc [Tokio Cabinet]

Page 55: Python3 @ Linuxtage 2010

Ported LibrariesDatabase / GUI

‣ sqlite3 [part of stdlib]

‣ py-postgresql / pg8000-py3

‣ PyQt

Page 56: Python3 @ Linuxtage 2010

In The PipelineWSGI

‣ Werkzeug

‣ CherryPy

‣ mod_wsgi

Moving Target: WSGI 1.1 spec probably based on mod_wsgi for Python

Page 57: Python3 @ Linuxtage 2010

Any Questions?

Page 58: Python3 @ Linuxtage 2010

Legal

licensed under the creative commons attribution-noncommercial-share alike 3.0 austria license

© Copyright 2010 by Armin Ronacherimages in this presentation used under compatible creative commons licenses. sources: http://www.flickr.com/photos/42311564@N00/2355590508/ http://www.flickr.com/photos/special/1597251/ http://www.flickr.com/photos/reillyandrew/2943521972/ http://www.flickr.com/photos/etobicokesouth/566912940/ http://www.flickr.com/photos/azrasta/4528604334/ http://www.flickr.com/photos/oneeighteen/481873844/ http://www.flickr.com/photos/mar00ned/260473163/ http://www.flickr.com/photos/revilla/1347710195/ http://www.flickr.com/photos/tommyhj/346075714/ http://www.flickr.com/photos/asoka/1443066116/ http://www.flickr.com/photos/thetruthabout/4285919377/ http://www.flickr.com/photos/nasedojp/2317015728/ http://www.flickr.com/photos/dullhunk/202872717/ http://www.flickr.com/photos/carbonnyc/3149965963/ http://www.flickr.com/photos/beezly/213880808/ http://www.flickr.com/photos/juniorvelo/4490511204/ http://www.flickr.com/photos/niwota-studios/3586953497/ http://www.flickr.com/photos/the-lees/134610871/ http://www.flickr.com/photos/kubina/131673530/ http://www.flickr.com/photos/bootbearwdc/37621686/ http://www.flickr.com/photos/spursfan_ace/2328879637/ http://www.flickr.com/photos/9619972@N08/1182211122/ http://www.flickr.com/photos/alanvernon/3659772103/ http://www.flickr.com/photos/jurvetson/17095584/ http://www.flickr.com/photos/lemsipmatt/4291448020/ http://www.flickr.com/photos/eurodrifter/182713903/ http://www.flickr.com/photos/xfp/3286570553/