Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati

Programmare in Python - Parte 16

Testo originale

A while ago, I promised someone that I would discuss the differences between Python 2.x and 3.x. Last time, I said that we would continue our pygame programming, but I felt that I should keep my promise, so we'll delve into pygame more next time.

Many changes have gone into Python 3.x. There is a large amount of information about these changes on the Web, and I'll include a few links at the end of the article. There are also many concerns about making the change. I'm going to concentrate on changes that affect the things you've learned so far.

Let's get started.

PRINT

As I've said before, one of the most important issues is the way we deal with the Print command. Under 2.x we simply can use:

print “This is a test”

and be done with it. However under 3.x, if we try that we will get the error message shown above right.

Not happy. In order to use the print command, we must put what we want to print in parentheses like this:

print(“this is a test”)

Not a very big change, but something we have to be aware of. You can get ready for your own migration by using this syntax under python 2.x.

Formatting and variable substitution

Formatting and variable substitution have also changed. Under 2.x, we have used things like the example shown below left, and, under 3.1, you can get the proper result. However, that is due to change since the '%s' and '%d' formatting functions are going away. The new way is to use '{x}' replacement statements is shown below.

It seems to me to be actually easier to read. You can also do things like this:

>>> print("Hello {0}. I'm glad you are here at {1}".format("Fred","MySite.com"))

Hello Fred. I'm glad you are here at MySite.com

>>>

Remember, you can still use '%s' and so on, but they will be going away.

Numbers

Under Python 2.x, if you did: x = 5/2.0 x would contain 2.5. However if you did: x = 5/2 x would contain 2 due to truncation. Under 3.x, if you do: x = 5/2 you still get 2.5. To truncate the division you have to do: x = 5//2

INPUT

A while back, we dealt with a menu system that used raw_input() to get a response from the user of our application. It went something like this:

response = raw_input('Enter a selection -> ')

That was fine under 2.x. However, under 3.x we get:

Traceback (most recent call last):

  • File "<stdin>", line 1, in <module>

NameError: name 'raw_input' is not defined

This isn't a big issue. The raw_input() method has been replaced with input(). Simply change the line to:

response = input('Enter a selection -> ')

and it works just fine.

Not Equal

Under 2.x, we could test for ‘not equal’ with “<>”. However, that's not allowed in 3.x The test operator is now “!=”.

Converting older programs to Python 3.x

Python 3.x comes with a utility to help convert a 2.x application to 3.x compliant code. This doesn't always work, but it will get you close in many cases. The conversion tool is named (aptly) “2to3”. Let's take a really simple program as an example. The example below is from way back in Beginning Python Part 3.

When run under 2.x, the output looks like that shown above right.

Of course, when we run it under 3.x, it doesn't work.

  • File "pprint1.py", line 18

SyntaxError: invalid syntax

We'll try to let the conversion app fix it for us. First, we should create a backup of our application that will be converted. I do it by creating a copy of the file, and append a “v3” to the end of the filename:

cp pprint1.py pprint1v3.py

There's multiple ways to run the app. The simplest way is just to let the app check our code and tell us where the problems are, which is shown below left.

Notice that the original source code is not changed. We have to use the “-w” flag to tell it to write the changes to the file. This is shown below right.

You'll also notice that the output is the same. This time, however, our source file (shown on the next page) is changed to a “version 3.x compatible” file.

Now the program works as it is supposed to under 3.x. And, since it was simple, it still runs under version 2.x as well.

Do I switch to 3.x now?

Most of the issues are common to any change in a programming language. Syntax changes abound with every new version. Short cuts like += or -= sometimes come out of the blue and actually make our lives easier.

What's the downside to simply migrating to 3.x right now? Well, there's a little bit. Many of the library modules that we've used are not available for version 3.x right now. Things like Mutegen that we've used a few articles back just aren't available yet. While this is a stumbling block, it doesn't require you to completely give up on Python v3.x.

My suggestion is to start coding using proper 3.x syntax now. Python version 2.6 supports almost everything you would need to write in the 3.x way. This way, you will be good to go once you have to change to 3.x. If you can live with the standard module library, go ahead and make the plunge. If, on the other hand, you push the envelope, you might just want to wait until the module library catches up. It will.

Below are some links that I thought might be helpful. The first is to the usage page of 2to3. The second is a 4-page cheat sheet that I have found to be a very good reference. The third is to what I consider to be just about the best book on using Python. (That is until I get around to writing mine.)

We'll see you next time.

Links

2to3 usage http://docs.python.org/library/2to3.html

Moving from Python 2 to Python 3 (A 4 page cheat sheet) http://ptgmedia.pearsoncmg.com/imprint_downloads/informit/promotions/python/python2python3.pdf

Dive into Python 3 http://diveintopython3.org/

Traduzione italiana

HOW-TO Programmare in Python - Parte 16 Scritto da Greg Walters

Tempo fa promisi a qualcuno che avrei trattato le differenze tra Python 2.x e 3.x. La volta scorsa dissi che avremmo continuato la programmazione con pygame ma sento che dovrei mantenere la mia promessa così approfondiremo di più pygame la prossima volta.

In Python 3.x sono stati fatti molti cambiamenti. Sul web c'è una gran quantità di informazioni riguardo questi mutamenti e alla fine dell'articolo includerò alcuni collegamenti. Vi sono anche molte preoccupazioni relativamente al fare il cambiamento. Mi concentrerò sulle variazioni che riguardano le cose che avete imparato finora.

Forza iniziamo.

Print Come ho detto prima uno degli argomenti più importanti è il modo in cui affrontiamo il comando print. Sotto la versione 2.x possiamo usare semplicemente:

print “This is a test”

e così sarà fatto. Tuttavia, sotto la 3.x, se ci proviamo otterremo il messaggio di errore mostrato sopra a destra.

Non è bello. Per usare il comando print dobbiamo mettere ciò che vogliamo stampare tra parentesi tonde così:

print (“This is a test”)

Non è un cambiamento molto grande ma è qualcosa di cui dobbiamo essere consapevoli. Potete prepararvi alla migrazione utilizzando questa sintassi sotto Python 2.x.

Formattazione e sostituzione di variabile

Anche la formattazione e la sostituzione di variabile sono cambiate. Sotto la versione 2.x abbiamo usato cose simili all'esempio mostrato sotto a sinistra e, sotto la versione 3.1, potete ottenere il giusto risultato. Comunque ciò è dovuto al cambiamento dato che le funzioni di formattazione '%s' e '%d' spariranno. Il nuovo modo, mostrato sotto, è usare le dichiarazioni di sostituzione '{x}'. In effetti mi sembra essere più facile da leggere. Potete anche fare cose come questa:

>>> print (“Hello {0}. I'm glad you are here at {1}.format(“Fred”,”MySite.com”))

Hello Fred. I'm glad you are here at MySite.com

>>>

Ricordate, potete ancora usare '%s' e così via ma essi spariranno.

Numeri

Sotto Python 2.x, se facevate:

x= 5/2.0

x avrebbe contenuto 2.5. Tuttavia se aveste fatto:

x= 5/2

x avrebbe contenuto 2 grazie al troncamento. Sotto la versione 3.x se fate:

x= 5/2

ottenete ancora 2.5. Per troncare la divisione dovete fare:

x = 5//2

Input

Un po' di tempo fa abbiamo avuto a che fare con un sistema di menù che usava raw_input() per ottenere una risposta dall'utente della nostra applicazione. Qualcosa che andava così:

response = raw_input('Enter a selection → ')

Questo andava bene sotto la versione 2.x. Tuttavia sotto la 3.x otteniamo:

Traceback (most recent call last):

  • File “<Stdin>, line 1, in <module>

NameError: name 'raw_input' is not definited

Questo non è un grosso problema. Il metodo raw_input() è stato sostituito da input(). Semplicemente, cambiate la riga in:

response = input ('Enter a selection → ')

e funziona proprio bene.

Non uguale

Sotto la versione 2.x avremmo potuto fare un test di “non uguaglianza” con “<>”. Tuttavia ciò non è consentito nella versione 3.x. L'operatore di prova adesso è “!=”.

Convertire i programmi più vecchi in Python 3.x

Python 3.x arriva con una utility che aiuta a convertire una applicazione 2.x in codice conforme alla versione 3.x. Non funziona sempre ma vi ci porterà vicini in molti casi. Lo strumento di conversione viene chiamato “2to3”. Prendiamo come esempio un programma davvero semplice. L'esempio sotto è preso da Programmare in Python Parte 3 di tempo addietro.

Quando viene eseguito sotto la versione 2.x, l'output è simile a quello mostrato sopra a destra.

Naturalmente quando lo eseguiamo sotto la 3.x non funziona.

  • File “pprint1.py”, line 18

SyntaxError: invalid syntax

Proveremo a lasciare che l'applicazione di conversione lo sistemi per noi. Per prima cosa dovremmo creare una copia di riserva dell'applicazione che sarà convertita. Io lo faccio creando una copia del file e aggiungendo un “v3” alla fine del nome:

cp pprint1.py pprint1v3.py

Vi sono molteplici modi di eseguire l'applicazione. Il modo più semplice è lasciare che l'applicazione controlli il codice e ci dica dove sono i problemi, il che viene mostrato sotto a sinistra.

Notate che il codice sorgente originale non è cambiato. Dobbiamo usare il flag “-w” per dirgli di scrivere sul file i cambiamenti.

Ciò è mostrato sotto a destra.

Noterete anche che l'output è identico. Questa volta, comunque, il file sorgente (mostrato nella pagina successiva) è cambiato in un file “versione 3 compatibile”.

Adesso il programma funziona come dovrebbe sotto la versione 3.x. E, dato che era semplice, funziona ancora anche sotto la versione 2.x.

Passo adesso alla versione 3.x?

Molti dei problemi sono comuni a qualunque cambiamento in un linguaggio di programmazione. I cambiamenti di sintassi abbondano ad ogni nuova versione. A volte spuntano fuori dal nulla scorciatoie come += o -= e rendono la nostra vita più facile, in effetti.

Quale è lo svantaggio del migrare semplicemente alla versione 3.x proprio adesso? Bé, c'è né un po'. Molti dei moduli librerie che abbiamo utilizzato non sono disponibili per la versione 3 proprio adesso. Cose come Mutegen, che abbiamo utilizzato qualche articolo fa, non sono proprio ancora disponibili. Quantunque questo sia un ostacolo, non richiede che rinunciate completamente a Python 3.x.

Il mio suggerimento è di cominciare ora a scrivere codice utilizzando una apposita sintassi 3.x. La versione 2.6 di Python supporta quasi tutto ciò di cui avreste bisogno per scrivere in modalità 3.x. In questo modo sarete pronti a partire una volta che dovrete cambiare alla 3.x. Se riuscite a sopravvivere con la libreria di moduli standard , continuate e fate il salto. Se, d'altro canto, andate oltre i limiti potreste voler attendere fino a che la libreria dei moduli si aggiorna. E lo farà.

Sotto vi sono alcuni collegamenti che ho pensato potessero essere utili. Il primo è alla pagina sull'impiego di 2to3. Il secondo è un bignamino di 4 pagine che ho scoperto essere un riferimento molto buono. Il terzo è a ciò che considero essere il miglior libro sull'utilizzo di Python (Questo fino a che deciderò di scrivere il mio).

Arrivederci alla prossima volta.

Collegamenti

utilizzo di 2to3

http://docs.python.org/library/2to3.html

Passare da Python 2 a Python 3 (un bignamino di 4 pagine)

http://ptqmedia.pearsoncmq.com/imprint_downloads/informit/promotions/python/python2python3.pdf

Dive into Python 3

http://diveintopython3.org

Greg Walter è il proprietario della RainyDay Solutions, LLC, una società di consulenza in Aurora, Colorado e programma dal 1972. Ama cucinare, fare escursioni, ascoltare musica e passare il tempo con la sua famiglia.

Revisione

HOW-TO Programmare in Python - Parte 16 Scritto da Greg Walters

Tempo fa promisi a qualcuno che avrei trattato le differenze tra Python 2.x e 3.x. La volta scorsa dissi che avremmo continuato la programmazione con pygame ma sento che dovrei mantenere la mia promessa così approfondiremo di più pygame la prossima volta.

In Python 3.x sono stati fatti molti cambiamenti. Sul web c'è una gran quantità di informazioni riguardo questi mutamenti e alla fine dell'articolo includerò alcuni collegamenti. Vi sono anche molte preoccupazioni relativamente al fare il cambiamento. Mi concentrerò sulle variazioni che riguardano le cose che avete imparato finora.

Forza, iniziamo.

PRINT

Come ho detto prima uno degli argomenti più importanti è il modo in cui affrontiamo il comando print. Con la versione 2.x possiamo usare semplicemente:

print "This is a test"

e così sarà fatto. Tuttavia, con la 3.x, se ci proviamo otterremo il messaggio di errore mostrato sopra a destra.

Non è bello. Per usare il comando print dobbiamo mettere ciò che vogliamo stampare tra parentesi tonde così:

print ("This is a test")

Non è un cambiamento molto grande ma è qualcosa di cui dobbiamo essere consapevoli. Potete prepararvi alla migrazione utilizzando questa sintassi sotto Python 2.x.

Formattazione e sostituzione di variabile

Anche la formattazione e la sostituzione di variabile sono cambiate. Con la versione 2.x abbiamo usato cose simili all'esempio mostrato sotto a sinistra e, con la versione 3.1, potete ottenere il giusto risultato. Comunque ciò è dovuto al cambiamento dato che le funzioni di formattazione '%s' e '%d' spariranno. Il nuovo modo, mostrato sotto, è usare le dichiarazioni di sostituzione '{x}'. In effetti mi sembra essere più facile da leggere. Potete anche fare cose come questa:

>>> print ("Hello {0}. I'm glad you are here at {1}.format("Fred","MySite.com"))

Hello Fred. I'm glad you are here at MySite.com

>>>

Ricordate, potete ancora usare '%s' e così via ma essi spariranno.

Numeri

Sotto Python 2.x, se facevate:

x = 5/2.0

x avrebbe contenuto 2.5. Tuttavia se aveste fatto:

x = 5/2

x avrebbe contenuto 2 grazie al troncamento. Sotto la versione 3.x se fate:

x = 5/2

ottenete ancora 2.5. Per troncare la divisione dovete fare:

x = 5//2

Input

Un po' di tempo fa abbiamo avuto a che fare con un sistema di menù che usava raw_input() per ottenere una risposta dall'utente della nostra applicazione. Qualcosa che andava così:

response = raw_input('Enter a selection -> ')

Questo andava bene sotto la versione 2.x. Tuttavia sotto la 3.x otteniamo:

Traceback (most recent call last):

  • File "<Stdin>", line 1, in <module>

NameError: name 'raw_input' is not definited

Questo non è un grosso problema. Il metodo raw_input() è stato sostituito da input(). Semplicemente, cambiate la riga in:

response = input ('Enter a selection -> ')

e funziona proprio bene.

Non uguale

Sotto la versione 2.x avremmo potuto fare un test di "non uguaglianza" con "<>". Tuttavia ciò non è consentito nella versione 3.x. L'operatore di prova adesso è "!=".

Convertire i programmi più vecchi in Python 3.x

Python 3.x arriva con una utility che aiuta a convertire un'applicazione 2.x in codice conforme alla versione 3.x. Non funziona sempre ma vi ci porterà vicini in molti casi. Lo strumento di conversione viene chiamato "2to3". Prendiamo come esempio un programma davvero semplice. L'esempio sotto è preso da Programmare in Python Parte 3 di tempo addietro.

Quando viene eseguito sotto la versione 2.x, l'output è simile a quello mostrato sopra a destra.

Naturalmente quando lo eseguiamo sotto la 3.x non funziona.

SyntaxError: invalid syntax

Proveremo a lasciare che l'applicazione di conversione lo sistemi per noi. Per prima cosa dovremmo creare una copia di riserva dell'applicazione che sarà convertita. Io lo faccio creando una copia del file e aggiungendo un "v3" alla fine del nome:

cp pprint1.py pprint1v3.py

Vi sono molteplici modi di eseguire l'applicazione. Il modo più semplice è lasciare che l'applicazione controlli il codice e ci dica dove sono i problemi, il che viene mostrato sotto a sinistra.

Notate che il codice sorgente originale non è cambiato. Dobbiamo usare il flag "-w" per dirgli di scrivere sul file i cambiamenti. Ciò è mostrato sotto a destra.

Noterete anche che l'output è identico. Questa volta, comunque, il file sorgente (mostrato nella pagina successiva) è cambiato in un file "versione 3 compatibile".

Adesso il programma funziona come dovrebbe sotto la versione 3.x. E, dato che era semplice, funziona ancora anche sotto la versione 2.x.

Passo adesso alla versione 3.x?

Molti dei problemi sono comuni a qualunque cambiamento in un linguaggio di programmazione. I cambiamenti di sintassi abbondano ad ogni nuova versione. A volte spuntano fuori dal nulla scorciatoie come += o -= e rendono la nostra vita più facile, in effetti.

Quale è lo svantaggio del migrare semplicemente alla versione 3.x proprio adesso? Beh, ce n'è un po'. Molti moduli di librerie che abbiamo utilizzato non sono disponibili per la versione 3 proprio adesso. Cose come Mutegen, che abbiamo utilizzato qualche articolo fa, non sono proprio ancora disponibili. Quantunque questo sia un ostacolo, non richiede che rinunciate completamente a Python 3.x.

Il mio suggerimento è di cominciare ora a scrivere codice utilizzando un'apposita sintassi 3.x. La versione 2.6 di Python supporta quasi tutto ciò di cui avreste bisogno per scrivere in modalità 3.x. In questo modo sarete pronti a partire una volta che dovrete cambiare alla 3.x. Se riuscite a sopravvivere con la libreria di moduli standard, continuate e fate il salto. Se, d'altro canto, andate oltre i limiti potreste voler attendere fino a che la libreria dei moduli si aggiorna. E lo farà.

Sotto vi sono alcuni collegamenti che ho pensato potessero essere utili. Il primo è alla pagina sull'impiego di 2to3. Il secondo è un bignamino di 4 pagine che ho scoperto essere un riferimento molto buono. Il terzo è a ciò che considero essere il miglior libro sull'utilizzo di Python (questo fino a che deciderò di scrivere il mio).

Arrivederci alla prossima volta.

Collegamenti

Utilizzo di 2to3

http://docs.python.org/library/2to3.html

Passare da Python 2 a Python 3 (un bignamino di 4 pagine)

http://ptqmedia.pearsoncmq.com/imprint_downloads/informit/promotions/python/python2python3.pdf

Dive into Python 3

http://diveintopython3.org

Greg Walter è il proprietario della RainyDay Solutions, LLC, una società di consulenza in Aurora, Colorado e programma dal 1972. Ama cucinare, fare escursioni, ascoltare musica e passare il tempo con la sua famiglia.


CategoryHomepage