P L O N E P Y T H O N 3
PHILIP BAUER
♥
TEXT (WAS UNICODE IN PY2)
BYTE S (WAS STRING IN PY2)
STRING (BYTES IN PY2 / TEXT IN PY3)
BYTES ARE MEASURED IN
KILOS, STORED IN DISKS
AND TRANSFERED
THROUGH CABLES
SAY: TEXT & BYTES

NOT: UNICODE & STRING
U N I C O D E S A N D W I C H
B Y T E S | T E X T | B Y T E ST E X T
safe_text (safe_unicode)
safe_bytes (safe_encode)
s a f e _ n a t i v e s t r i n g
b y t e s i n p y 3
t e x t i n p y 3
>>> 'foo' == u'foo'

True

>>> 'foo' + u'foo'

u'foofoo'

>>> u'foo' + 'foo'

u'foofoo'
Python 2
IMPLICIT CONVERSION
>>> b'foo' == 'foo'

False

>>> 'foo' + b'foo'

TypeError: can only concatenate str (not
"bytes") to str

>>> b'foo' + 'foo'

TypeError: can't concat str to bytes
Python 3
IMPLICIT CONVERSION
>>> byte = b'huhu'

>>> byte

'huhu'

>>> byte.decode('utf8')

u'huhu'

>>> byte.encode('utf8')

'huhu'
Python 2: bytes
EXPLICIT CONVERSION
>>> byte = b'huhu'

>>> byte

b'huhu'

>>> byte.decode('utf8')

'huhu'

>>> byte.encode('utf8')

AttributeError: 'bytes' object has no
attribute 'encode'
Python 3: bytes
EXPLICIT CONVERSION
>>> text = u'foo'

>>> text

u'foo'

>>> text.encode('utf8')

'foo'

>>> text.decode('utf8')

u'foo'
Python 2: text
EXPLICIT CONVERSION
>>> text = 'foo'

>>> text

'foo'

>>> text.encode('utf8')

b'foo'

>>> text.decode('utf8')

AttributeError: 'str' object has no attribute
'decode'
Python 3: text
EXPLICIT CONVERSION
ITERATING IS WEIRD
>>> [i for i in 'huhu']

['h', 'u', 'h', 'u']
Python 2
ITERATING OVER BYTES
>>> [i for i in b'huhu']

[104, 117, 104, 117]

>>> [chr(i) for i in b'huhu']

['h', 'u', 'h', 'u']

>>> [chr(i).encode('utf8') for i in b'huhu']

[b'h', b'u', b'h', b'u']
Python 3
ITERATING OVER BYTES
P Y T H O N 3 . 3
• Py3: u'text'
• Py2: b'bytes'
• u'text' is text in py2 and py3
• b'bytes' is bytes in py2 and py3
• text/bytes is the main issue when migrating code
• It makes much more sense in py3
• Writing code that works in py2/py3 is not easy
L E T ' S TA L K A B O U T B R A Z I L
ZOPE 4
POR TING PLONE TO
PYTHON 3
1. MIGRATE PACKAGES FLYING BLIND
• Tools: six, sixer and python-modernize
• Educated Guessing™
• Testing in Python 2
2 . S TA R T U P A N D M A N U A L T E S T
• Fix what breaks
• Test features manually
• Nightly demo
3 . A U T O M AT E D T E S T S
• Get > 10.000 tests to work on Python 3
• Hunt & kill test-isolation issues
• doctests oh my
CURRENT STATE (DEMO)
THANK YOU TO ALL
THAT HELPED
STEFFEN ALLNER | PHILIP BAUER | ROEL
BRUGGINK | GODEFROID CHAPELLE | MAIK
DERSTAPPEN | GIL FORCADA | HARALD
FRISENEGGER | DAVID GLICK | DANIEL
HAVLIK | MICHAEL HOWITZ | JENS KLEIN |
DAVI LIMA | ALEXANDER LOECHEL |
THOMAS LOTZE | PETER MATHIS | JAN
MEVISSEN | ROBERT NIEDERREITER | JONI
ORPONEN | ALESSANDRO PISA | JOHANNES
RAGGAM | MAURITS VAN REES | MANUEL
REINHARDT | THOMAS SCHORR | ERIC
STEELE | JENS VAGELPOHL | MATTHEW
WILKES | ANDI ZEIDLER
UPGRADE TO PYTHON 3
6 STEP PROCESS
1 . U P G R A D E T O P L O N E 5 . 2
• Use Python 2.7
2 . D R O P A R C H E T Y P E S
• It's not asking too much
• Migration for default types is available since 2013
• Migration for custom types is available since 2015
3 . M I G R AT E Y O U R C O D E T O P Y T H O N 3
• Without Database
• Support Python 2 and Python 3
• Small addons: Startup and fix whatever fails
• Bigger addons: Use python-modernize
• Same with tests
• Beware of complex doctests
4 . M I G R AT E A D D O N S
• Same as above
• Everyone benefits
5 . M I G R AT E Y O U R D ATA B A S E
• See David Glick's Talk
• Downtime/Read-only might be ineviable
6 . D E P L O Y O N P Y T H O N 3
• Test the production-setup with WSGI early
STAR T NOW
DON'T WAIT
WORK ITERATIVELY
R O A D M A P
• 5.2a1 now
• 5.2 final in February
T O D O
• FTP and/or WebDAV
• DB Migration
• Upgrade- and porting-guide
• Migrate Addons
• Performance-tests
COME TO THE SPRINT
BRING YOUR ADDONS
QUESTIONS
WHAT ABOUT PYTHON 4?
W H E N W I L L P L O N E D R O P
S U P P O R T F O R P Y T H O N 2 ?
WHAT ABOUT ZOPE 5?
WILL ARCHETYPES BE
POR TED TO PYTHON 3?
HOW DO WE REPLACE
FTP/WEBDAV?
W H Y D I D Y O U N O T ' S I M P LY '
M I G R AT E T O G U I L L I O T I N A ?
CAN I NOW USE ASYNC/
AWAIT?
W H Y D O E S N ' T T H E P L O N E
F O U N D AT I O N S I M P LY B U Y
S U P P O R T F O R P Y T H O N 2 . 7 F R O M
R E D H AT / I B M F O R A L L O F U S ?
DOES PYTHON 3 MAKE
PLONE RUN FASTER?
CAN I RUN THE SAME DB
IN PY2 AND PY3?
I S A D D O N < Y O U R N A M E H E R E >
A L R E A D Y P O R T E D ?
W I L L T H I S I N C R E A S E
P L O N E ' S M A R K E T S H A R E ?
HOW DO I DEPLOY INTO
PRODUCTION?
WILL THIS WORK ON
WINDOWS?
ARE PRODUCTION-TOOLS
ALREADY WORK, LIKE BACKUP,
ZRS OR RELSTORAGE?
DOES BOBTEMPLATES.PLONE AND
PLONECLI ALREADY WORK IN PY3?
MORE QUESTIONS...
@StarzelDe
pbauer
P L O N E P Y T H O N 3
PHILIP BAUER
♥
THANKS

Plone ♥︎ Python 3

  • 1.
    P L ON E P Y T H O N 3 PHILIP BAUER ♥
  • 2.
    TEXT (WAS UNICODEIN PY2) BYTE S (WAS STRING IN PY2) STRING (BYTES IN PY2 / TEXT IN PY3)
  • 3.
    BYTES ARE MEASUREDIN KILOS, STORED IN DISKS AND TRANSFERED THROUGH CABLES
  • 4.
    SAY: TEXT &BYTES
 NOT: UNICODE & STRING
  • 5.
    U N IC O D E S A N D W I C H B Y T E S | T E X T | B Y T E ST E X T
  • 6.
  • 7.
    s a fe _ n a t i v e s t r i n g b y t e s i n p y 3 t e x t i n p y 3
  • 8.
    >>> 'foo' ==u'foo' True >>> 'foo' + u'foo' u'foofoo' >>> u'foo' + 'foo' u'foofoo' Python 2 IMPLICIT CONVERSION
  • 9.
    >>> b'foo' =='foo' False >>> 'foo' + b'foo' TypeError: can only concatenate str (not "bytes") to str >>> b'foo' + 'foo' TypeError: can't concat str to bytes Python 3 IMPLICIT CONVERSION
  • 10.
    >>> byte =b'huhu' >>> byte 'huhu' >>> byte.decode('utf8') u'huhu' >>> byte.encode('utf8') 'huhu' Python 2: bytes EXPLICIT CONVERSION
  • 11.
    >>> byte =b'huhu' >>> byte b'huhu' >>> byte.decode('utf8') 'huhu' >>> byte.encode('utf8') AttributeError: 'bytes' object has no attribute 'encode' Python 3: bytes EXPLICIT CONVERSION
  • 12.
    >>> text =u'foo' >>> text u'foo' >>> text.encode('utf8') 'foo' >>> text.decode('utf8') u'foo' Python 2: text EXPLICIT CONVERSION
  • 13.
    >>> text ='foo' >>> text 'foo' >>> text.encode('utf8') b'foo' >>> text.decode('utf8') AttributeError: 'str' object has no attribute 'decode' Python 3: text EXPLICIT CONVERSION
  • 14.
  • 15.
    >>> [i fori in 'huhu'] ['h', 'u', 'h', 'u'] Python 2 ITERATING OVER BYTES
  • 16.
    >>> [i fori in b'huhu'] [104, 117, 104, 117] >>> [chr(i) for i in b'huhu'] ['h', 'u', 'h', 'u'] >>> [chr(i).encode('utf8') for i in b'huhu'] [b'h', b'u', b'h', b'u'] Python 3 ITERATING OVER BYTES
  • 17.
    P Y TH O N 3 . 3 • Py3: u'text' • Py2: b'bytes' • u'text' is text in py2 and py3 • b'bytes' is bytes in py2 and py3
  • 18.
    • text/bytes isthe main issue when migrating code • It makes much more sense in py3 • Writing code that works in py2/py3 is not easy
  • 19.
    L E T' S TA L K A B O U T B R A Z I L
  • 27.
  • 29.
    POR TING PLONETO PYTHON 3
  • 31.
    1. MIGRATE PACKAGESFLYING BLIND • Tools: six, sixer and python-modernize • Educated Guessing™ • Testing in Python 2
  • 32.
    2 . STA R T U P A N D M A N U A L T E S T • Fix what breaks • Test features manually • Nightly demo
  • 33.
    3 . AU T O M AT E D T E S T S • Get > 10.000 tests to work on Python 3 • Hunt & kill test-isolation issues • doctests oh my
  • 35.
  • 36.
    THANK YOU TOALL THAT HELPED
  • 37.
    STEFFEN ALLNER |PHILIP BAUER | ROEL BRUGGINK | GODEFROID CHAPELLE | MAIK DERSTAPPEN | GIL FORCADA | HARALD FRISENEGGER | DAVID GLICK | DANIEL HAVLIK | MICHAEL HOWITZ | JENS KLEIN | DAVI LIMA | ALEXANDER LOECHEL | THOMAS LOTZE | PETER MATHIS | JAN MEVISSEN | ROBERT NIEDERREITER | JONI ORPONEN | ALESSANDRO PISA | JOHANNES RAGGAM | MAURITS VAN REES | MANUEL REINHARDT | THOMAS SCHORR | ERIC STEELE | JENS VAGELPOHL | MATTHEW WILKES | ANDI ZEIDLER
  • 46.
  • 47.
  • 48.
    1 . UP G R A D E T O P L O N E 5 . 2 • Use Python 2.7
  • 49.
    2 . DR O P A R C H E T Y P E S • It's not asking too much • Migration for default types is available since 2013 • Migration for custom types is available since 2015
  • 50.
    3 . MI G R AT E Y O U R C O D E T O P Y T H O N 3 • Without Database • Support Python 2 and Python 3 • Small addons: Startup and fix whatever fails • Bigger addons: Use python-modernize • Same with tests • Beware of complex doctests
  • 51.
    4 . MI G R AT E A D D O N S • Same as above • Everyone benefits
  • 52.
    5 . MI G R AT E Y O U R D ATA B A S E • See David Glick's Talk • Downtime/Read-only might be ineviable
  • 53.
    6 . DE P L O Y O N P Y T H O N 3 • Test the production-setup with WSGI early
  • 54.
    STAR T NOW DON'TWAIT WORK ITERATIVELY
  • 55.
    R O AD M A P • 5.2a1 now • 5.2 final in February
  • 56.
    T O DO • FTP and/or WebDAV • DB Migration • Upgrade- and porting-guide • Migrate Addons • Performance-tests
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
    W H EN W I L L P L O N E D R O P S U P P O R T F O R P Y T H O N 2 ?
  • 62.
  • 63.
    WILL ARCHETYPES BE PORTED TO PYTHON 3?
  • 64.
    HOW DO WEREPLACE FTP/WEBDAV?
  • 65.
    W H YD I D Y O U N O T ' S I M P LY ' M I G R AT E T O G U I L L I O T I N A ?
  • 66.
    CAN I NOWUSE ASYNC/ AWAIT?
  • 67.
    W H YD O E S N ' T T H E P L O N E F O U N D AT I O N S I M P LY B U Y S U P P O R T F O R P Y T H O N 2 . 7 F R O M R E D H AT / I B M F O R A L L O F U S ?
  • 68.
    DOES PYTHON 3MAKE PLONE RUN FASTER?
  • 69.
    CAN I RUNTHE SAME DB IN PY2 AND PY3?
  • 70.
    I S AD D O N < Y O U R N A M E H E R E > A L R E A D Y P O R T E D ?
  • 71.
    W I LL T H I S I N C R E A S E P L O N E ' S M A R K E T S H A R E ?
  • 72.
    HOW DO IDEPLOY INTO PRODUCTION?
  • 73.
    WILL THIS WORKON WINDOWS?
  • 74.
    ARE PRODUCTION-TOOLS ALREADY WORK,LIKE BACKUP, ZRS OR RELSTORAGE?
  • 75.
  • 76.
  • 77.
    @StarzelDe pbauer P L ON E P Y T H O N 3 PHILIP BAUER ♥ THANKS