2009-09-28 14 views
6

Le abitudini di Perl sono dure a morire. Dichiarazione delle variabili, ambito, globale/locale è diverso tra le 2 lingue. Esiste una serie di idiomi di linguaggio Python consigliati che renderanno meno dolorosa la transizione dalla codifica perl alla codifica di Python.Gestione delle abitudini Perl in un ambiente Python

L'errore di ortografia variabile può richiedere una quantità di tempo straordinaria.

Capisco il problema dichiarazione di variabile è quasi-religioso tra la gente pitone Non sto sostenendo per le modifiche della lingua o caratteristiche, solo un ponte affidabile tra le 2 lingue che non provocano le mie abitudini perl affondano i miei sforzi di pitone.

Grazie.

+4

Per quanto riguarda gli errori di digitazione che ti riguardano, ci sono alcuni punti interessanti in http://stackoverflow.com/questions/613364/ - riassunto: le persone consigliano di utilizzare un controllo statico come pylint – daotoad

+0

Puoi spiegare di più su cosa intendi con il "problema di dichiarazione variabile"? Conosco sia Perl che Python e mentre le lingue sono davvero diverse, non sono sicuro di quale problema ti riferisci. –

+5

In perl "usa rigorosamente;" è una graffetta per molti di noi. La mia comprensione di Python (che non è molto buona) è che Python non ha questo costrutto. Questo è ciò che intendo per "problema di dichiarazione delle variabili". Grazie. – namrokretep

risposta

1

Mi piace la domanda, ma non ho alcuna esperienza in Perl, quindi non sono sicuro di come consigliarti al meglio.

Ti suggerisco di fare una ricerca su Google per "idiomi Python". Troverete alcune gemme. In particolare:

http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

http://docs.python.org/dev/howto/doanddont.html

http://jaynes.colorado.edu/PythonIdioms.html

quanto riguarda la questione variabile "dichiarazione", ecco il mio consiglio per voi:

Ricordate che in Python, gli oggetti hanno una vita propria, separati dai nomi delle variabili. Un nome di variabile è un tag associato a un oggetto. In qualsiasi momento, puoi riassociare il nome a un oggetto diverso, forse di un tipo completamente diverso. Quindi, questo è perfettamente legale:

x = 1 # bind x to integer, value == 1 
x = "1" # bind x to string, value is "1" 

Python è infatti fortemente tipizzato; prova ad eseguire il codice 1 + "1" e vedi come funziona, se non mi credi. L'oggetto intero con valore 1 non accetta l'aggiunta di un valore stringa, in assenza di una coercizione di tipo esplicita. Quindi i nomi Python non hanno mai caratteri sigillo che contrassegnano le proprietà della variabile; questo non è solo il modo in cui Python fa le cose. Qualsiasi nome di identificatore legale può essere associato a qualsiasi oggetto Python di qualsiasi tipo.

+0

"rebind il nome ad un oggetto diverso" ... Il sistema OO Perl è stato preso da Python, quindi è possibile fare in Perl. –

+0

Come ho già detto, non ho una vera esperienza in Perl, quindi non so nulla del sistema Perl OO. Ma sono curioso: ho pensato a Perl che c'erano "sigilli" che ti dicevano qualcosa sul tipo di variabile. Ad esempio, @x è un array. Non puoi rebindare "@x" per indicare qualcosa che non è un array, giusto? In Python non ci sono sigilli, e questa è una differenza che ho ritenuto opportuno commentare. – steveha

+1

@steveha: In perl, puoi avere $ x, @x,% x e * x, tutti i diversi tipi con lo stesso nome. Non del tutto le migliori pratiche per farlo, ma è lì se lo vuoi.(Ma sì, "@x" significa matrice x se è tutto ciò che cerchi). – runrig

1

Nel python $ _ non esiste tranne nella shell python e le variabili con ambito globale sono disapprovate.

In pratica Questo ha due effetti principali:

  1. In Python non è possibile utilizzare le espressioni regolari nel modo più naturale Perl, s0 corrispondenti ciascuna iterate $ _ e allo stesso modo la cattura di partite è più ingombrante
  2. funzioni Python tendono ad essere chiamati esplicitamente o hanno variabili predefinite

Tuttavia queste differenze sono piuttosto ridotte se si considera che in Python quasi tutto diventa una classe. Quando facevo il Perl pensavo di "intagliare"; in Python mi sento piuttosto "sto componendo".

Python non ha la ricchezza idiomatica di Perl e penso che sia probabilmente un errore tentare di fare la traduzione.

+0

perl() if (c'è ($ # niente) || $ rich = ~/about /); –

0

Non digitare erroneamente i nomi delle variabili. Sul serio.Usa parole brevi, semplici e descrittive, usale localmente e non fare affidamento sull'ambito globale.

Se stai facendo un progetto più grande che non è servito bene da questo, usa pylint, unit test e coverage.py per assicurarti che il tuo codice faccia quello che ti aspetti.

copiato da un commento in uno dei other threads:

" 'vars severe' è principalmente destinato a fermare i riferimenti typoed e perso-out 'miei di di creare globali accidentali (beh, variabili del pacchetto in termini Perl). Questo non può accadere in Python poiché le assegnazioni nude sono predefinite per la dichiarazione locale e i simboli non assegnati nudi provocano un'eccezione. "

+4

Ma un'assegnazione tipizzata può ancora diventare una dichiarazione di una variabile morta, che porta a un errore logico ma nessun errore di compilazione. – hobbs

+1

nomi brevi? ma poi devi avere commenti! (http://xrl.us/bfn45h) – ysth

+0

@hobbs bene si. Usa un buon ide e usa un sacco/test case come ho detto? Se non funziona, fallisce. Semplice. Python non ha una modalità "strict", provare a calzare uno in è rompere la lingua. Se i tuoi nomi sono così lunghi da scriverli regolarmente, devi rinominarli. Inoltre, python non è perl. –

2

Dividere le classi Python in file separati (come in Java, una classe per file) aiuta a trovare problemi di scoping, anche se questo non è python idiomatico (cioè non pythonic).

ho scritto pitone dopo molto perl e trovato questo da tchrist per essere utile, anche se è vecchio:

http://linuxmafia.com/faq/Devtools/python-to-perl-conversions.html

abituando a fare a meno perl di più eccellente scoping variabile è stata la seconda problema più difficile con la mia transizione perl-> python. Il primo è ovvio se hai molto perl: CPAN.

+0

Immagino che tu non sappia nulla di pypi. –

+2

Conosco Pypi e posso confrontarlo con CPAN. Su CPAN ho trovato una grande percentuale dei miei progetti già codificati lì, perché ha ciò di cui ho bisogno. In pypi trovo grandi cose, ma per me è una percentuale minore. Dipende dal progetto. Per le interfacce, l'elaborazione del testo e il processo generale di trasformazione dei dati, preferisco Perl/CPAN. Per algoritmi numerici, logistica e integrazione con altri linguaggi preferisco Python/pypi. La mia ultima elaborazione delle immagini è Python, la mia ultima integrazione di strumenti CAD è Perl. Scelgo la lingua e la biblioteca su base progetto per progetto. Anche C++, vbs, qualunque cosa. –

1

, leggere, comprendere, seguire, e l'amore PEP 8, che elenca in dettaglio le linee guida di stile per tutto su Python.

Seriamente, se si desidera conoscere gli idiomi e le abitudini consigliate di Python, questa è la fonte.