È male usare i caratteri Unicode nei nomi delle variabili? [chiuso]


82

Di recente ho provato a implementare un algoritmo di classificazione, AllegSkill, su Python 3.

Ecco come appare la matematica:

testo alternativo

No davvero.

Questo è quindi quello che ho scritto:

t = (µw-µl)/c  # those are used in
e = ε/c        # multiple places.
σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

In realtà ho pensato che Python 3 sia un peccato non accettare o ²come nomi di variabili.

>>> √ = lambda x: x**.5
  File "<stdin>", line 1
    √ = lambda x: x**.5
      ^
SyntaxError: invalid character in identifier

Sono fuori di testa? Avrei dovuto ricorrere a una versione solo ASCII? Perché? Un'unica versione ASCII di quanto sopra non sarebbe più difficile da convalidare per l'equivalenza con le formule?

Intendiamoci, capisco che alcuni glifi Unicode sembrano molto simili tra loro e alcuni come (o è quello ▗▖) o ╦ semplicemente non hanno alcun senso nel codice scritto. Tuttavia, questo non è il caso di matematica o glifi di frecce.


Per richiesta, l'unica versione ASCII sarebbe qualcosa sulla falsariga di:

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

... per ogni passaggio dell'algoritmo.


58
È folle, completamente illeggibile e indicibilmente bello.
Dominique McDonnell,


3
Trovo molto positivo che Python non accetti le operazioni aritmetiche come variabili. Un segno di radice quadrata dovrebbe indicare l'operazione di acquisizione di una radice quadrata e non dovrebbe essere una variabile.
David Thornley,

4
@ David, non c'è una tale distinzione in Python. In effetti, sqrt = lambda x: x**.5mi viene una funzione (più precisamente, un callable): sqrt(2) => 1.41421356237.
badp

4
OutputStream.🚽;

Risposte:


54

Sento fortemente che semplicemente sostituirmi σcon so sigmasarebbe stupido, al limite con un cervello morto.

Qual è il potenziale guadagno? Bene vediamo …

  • Migliora la leggibilità? No, per niente. Se così fosse, la formula originale avrebbe senza dubbio usato anche lettere latine.

  • Migliora la scrivibilità? A prima vista, sì. Ma al secondo no. Perché questa formula non cambierà mai (beh, "mai"). Normalmente non sarà necessario modificare il codice né estenderlo utilizzando queste variabili. Quindi la scrivibilità non è un problema, solo per questa volta.

Personalmente, penso che i linguaggi di programmazione abbiano un vantaggio rispetto alle formule matematiche: puoi usare identificatori significativi ed espressivi. In matematica, questo non è normalmente il caso, quindi facciamo ricorso a variabili di una lettera, rendendole occasionalmente greche.

Ma il greco non è il problema. Gli identificatori di una lettera non descrittivi sono.

Quindi, o tenere la notazione originale ... dopo tutto, se il linguaggio di programmazione non supporta Unicode negli identificatori, quindi non c'è alcun ostacolo tecnico. O usa identificatori significativi. Non limitarti a sostituire i glifi greci con glifi latini. O quelli arabi o quelli hindi.


3
Alcuni strumenti non sono in grado di leggere caratteri Unicode, anche se il linguaggio di programmazione ne supporta l'utilizzo. Non lo definirei una decisione mortale usare nomi di variabili non unicode, e questo vale ancora 2,5 anni dopo il tuo post.
Gary S. Weaver,

44
@Gary "Alcuni strumenti non sono in grado di leggere Unicode", quindi cambia gli strumenti, sono una schifezza. Siamo spiacenti, è il 2013 e non ho simpatia e ancora meno pazienza per tali strumenti. Il catering incessante di strumenti difettosi impedisce progressi.
Konrad Rudolph,

3
@KonradRudolph Il mio punto è che alcuni strumenti non supportano e non possono supportare Unicode per nessun motivo, quindi "cambiare gli strumenti" non è sempre la risposta giusta. Sono d'accordo che Unicode è buono e gli strumenti dovrebbero capirlo, ma non è sempre un'opzione.

3
@Giovanni sostengo che "cambiare gli strumenti" è una risposta appropriata. Il tuo esempio in particolare illustra un caso del genere: i .propertiesfile Java sono banali da analizzare. Se ti è capitato di lavorare con una catena di strumenti che, supportata da .propertiesfile, non supportava Unicode, è del tutto ragionevole abbandonare detta catena di strumenti (e sostituirla tu stesso, trovare un'alternativa o, nel peggiore dei casi, commissionarne una ). Naturalmente questo non si applica ai sistemi legacy. Ma per i sistemi legacy non viene mai applicata nessuna delle considerazioni sulle migliori pratiche.
Konrad Rudolph

8
Questi problemi di "interscambio" di cui parli sembrano essere principalmente il problema degli sviluppatori Java e Windows. Gran parte del mondo Linux è stato standardizzato su UTF-8 oltre un decennio fa. È sicuramente un problema di toolchain. Smetti di usare strumenti cattivi.
ricco ricordo

33

Personalmente, odierei vedere il codice in cui devo richiamare la mappa dei caratteri per digitarlo di nuovo. Anche se l'unicode corrisponde strettamente a ciò che è presente nell'algoritmo, è davvero dannoso per la leggibilità e la capacità di modifica. Alcuni editor potrebbero non avere nemmeno un carattere che supporti quel carattere.

Che dire di un'alternativa e basta avere il top //µ = ue scrivere tutto in ascii?


14
A proposito, non dare per scontato che tutte le tastiere espongano comodamente i tasti di codifica standard. Il mio layout di tastiera ha bisogno di tre tasti per digitare {e }(che fallisce in ttys tra l'altro) e manca completamente `e ~... come mai uno script Bash non mi richiederebbe di usare una mappa di caratteri, se non stessi usando una mappa di tasti personalizzata? :)
badp

4
Ho installato una tastiera greca accanto a quella nativa e posso passare da una tastiera a un'altra. Questo è utile quando si parla di matematica su IM / e-mail ... e ho già pensato di usarlo negli script Python.
liori,

18
Ugh. Basta sostituire le lettere greche con quelle semplici? Nessun guadagno. Usa nomi di variabili significativi o mantieni i nomi della carta. Nessun motivo per essere creativi.
Konrad Rudolph,

12
Basta non confondere µ e μ ...
endolith

4
Gli editor ragionevoli hanno metodi di input ragionevoli per Unicode che semplificano la modifica del codice in questo modo. Ad esempio, Emacs supporta (tra le altre cose) il TeXe rfc1345. TeXè proprio quello che sembra; ti permette di scrivere \sigmaper σe \toper . rfc1345ti dà alcune combinazioni come &s*per σe &->per . Come regola generale, non mi preoccupo di ospitare programmatori che utilizzano editor meno capaci di Emacs.
Tikhon Jelvis,

31

Questo argomento presuppone che non vi siano problemi con la digitazione di unicodi o la lettura di lettere greche

Ecco l'argomento: ti piacerebbe pi o circular_ratio?

In questo caso, preferirei pi a circular_ratio perché ho imparato a conoscere pi da quando ero alle elementari e posso aspettarmi che la definizione di pi sia ben radicata per tutti i programmatori che valgono la pena. Quindi non mi dispiacerebbe digitare π per significare circular_ratio.

Tuttavia, che dire

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

o

σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

Per me, entrambe le versioni sono ugualmente opache, proprio come pio πè, tranne che non ho imparato questa formula nella scuola elementare. winner_sigmae Wwinnon significa niente per me, o per chiunque altro legga il codice, e l'utilizzo di nessuno dei due σwnon lo rende migliore.

Quindi, l'uso di nomi descrittivi, ad esempio total_score, winning_ratioecc. Aumenterebbe la leggibilità molto meglio dell'uso di nomi ASCII che si limitano a pronunciare lettere greche . Il problema non è che non riesco a leggere le lettere greche, ma non riesco ad associare i caratteri (greco o no) a un "significato" della variabile.

È certamente capito il problema da soli quando si ha commentato: You should have seen the paper. It's just eight pages.... Il problema è se si basa la denominazione variabile su un documento, che sceglie nomi di una sola lettera per concisione piuttosto che leggibilità (indipendentemente dal fatto che siano greci), quindi le persone dovrebbero leggere il documento per poter associare le lettere a un "senso"; questo significa che stai mettendo una barriera artificiale affinché le persone possano capire il tuo codice, e questa è sempre una cosa negativa.

Anche quando vivi in ​​un mondo solo ASCII, entrambi a * b / 2e alpha * beta / 2sei un rendering altrettanto opaco della height * base / 2formula dell'area del triangolo. La illeggibilità dell'uso di variabili a lettera singola cresce esponenzialmente man mano che la formula aumenta in complessità e la formula AllegSkill non è certamente una formula banale.

La variabile a lettere singole è accettabile solo come semplice contatore di cicli, che si tratti di lettere singole greche o ascii a lettera singola, non mi interessa; nessun'altra variabile dovrebbe consistere esclusivamente in una singola lettera. Non mi interessa se usi le lettere greche per i tuoi nomi, ma quando le usi, assicurati di poter associare quei nomi con un "significato" senza dover leggere un articolo arbitrario da qualche altra parte.

Quando andavo alle elementari, sicuramente non mi dispiacerebbe vedere espressioni matematiche usando simboli come: +, -, ×, ÷, per l'aritmetica di base e √ () sarebbe una funzione a radice quadrata. Dopo essermi diplomato, non mi dispiacerebbe l'aggiunta di nuovi e brillanti simboli: ∫ per l'integrazione. Nota la tendenza, questi sono tutti operatori. Gli operatori sono molto più utilizzati dei nomi delle variabili, ma sono spesso riutilizzati per un significato completamente diverso (nel caso in cui i matematici riutilizzino gli operatori, il nuovo significato spesso contiene ancora alcune proprietà di base del vecchio significato; questo non è il caso di quando si riutilizzano i nomi delle variabili).

In conclusione, no, non è male usare i caratteri Unicode per i nomi delle variabili; tuttavia, è sempre male usare nomi di lettere singole per nomi di variabili e il permesso di usare nomi Unicode non è una licenza per usare nomi di variabili a lettera singola.


9
Ad essere onesti, le formule qui non hanno più senso anche se dovessi usare error_on_measured_skill_with_99th_percent_confidenceinvece di sigma.
badp

4
@badp: nomi lunghi! = Buoni nomi. Ciononostante, ci sono occasioni in cui è impossibile scegliere un buon nome (ad es. Quando si capisce solo la formula, ma non si comprende appieno ciò che ciascuna parte della formula fa (il che richiede un livello di comprensione completamente diverso)), quindi in quel caso, la seconda migliore alternativa è quella di coprirti il ​​culo con alcuni commenti (meglio che inviarli a un documento esterno). Aggiungi un dizionario di dati che spiega a cosa si riferiscono i nomi delle variabili, ad esempio // σw = skill level measurement error, ecc.
Lie Ryan,

1
@badp: A dire il vero, con solo quelle informazioni, che sigma si riferisce ad un fattore di confusione (per così dire), mi dà una comprensione leggermente migliore della formula rispetto a ciò che sigma mi colpisce. Quando la formula è difficile da capire all'inizio, non si desidera aggiungere più opacità.
Lie Ryan,

2
Sì. Questo. Sfortunatamente, l'ho trascurato quando ho scritto la mia risposta.
Konrad Rudolph,

3
Bene, chiunque lavori in qualsiasi cosa relativa alle statistiche sa che σ significa "deviazione standard". È un simbolo standard molto noto in quel dominio.
TRiG

14

Capisci il codice? Tutti gli altri che hanno bisogno di leggerlo? Se è così, non c'è problema.

Personalmente sarei felice di vedere il retro del codice sorgente solo ASCII.


Fatto. (Suppongo che l'ultima riga ti chiedesse di vedere la versione solo ASCII del codice?) [] (Http: // ~)
badp

4
@badp: No, sono stato io a chiedere di vedere la morte del codice solo ASCII.

finché non inizi a vedere cosa succede ai file sorgente Unicode durante l'atterraggio su un sistema Windows 1252 ...

1
@ Thorbjørn: se contengono la DBA, si spera che non accadrà nulla.

9

Sì, sei fuori di testa. Vorrei fare personalmente riferimento al numero di carta e formula in un commento e scrivere tutto in ASCII. Quindi, chiunque fosse interessato sarebbe in grado di correlare il codice e la formula.


5
È stato difficile per me assicurarmi che il codice e la formula corrispondessero in primo luogo ...
badp,

10
@Paul: fortunatamente, Unicode ha> 10 anni, quindi l'obiezione è stata risolta. E sebbene non ci sia un chiaro vincitore tra i diversi UTF, questo non è un problema: non doveva essercene uno. Descriverli a parte è banale per il software.
Konrad Rudolph,

1
@Konrad: Voglio dire 10 anni da oggi . Un discreto numero di programmi non supporta ancora Unicode. Inoltre, non sono d'accordo con la tua affermazione: non è banale scrivere una routine inversa generica che gestisca tutti e 3 gli utfs. Deve esserci un chiaro vincitore. Non ha senso supportare 3 diversi UTF (non consideriamo ancora le altre code page).
Paul Nathan,

3
@Paul: quanto spesso devi scrivere una "routine inversa generica"? I tre UTF hanno scopi diversi e non credo che otterrai mai il tuo desiderio di consolidamento.
Dean Harding,

7
@Paul: avvita questi programmi. Ci sono abbastanza buoni editor che sanno come gestire Unicode. Se qualche editore non è ancora salito sul carro, lascia che la selezione economica se ne occupi. E come diceva Dean, gli UTF hanno scopi diversi. È una buona cosa che esistano. E non vedo il punto nelle tue molteplici procedure inverse. Devi solo scriverlo una volta (ignorando i moduli di normalizzazione per ora): per i punti di codice, non per i singoli UTF.
Konrad Rudolph,

5

Direi che usare i nomi delle variabili Unicode è una cattiva idea per due motivi:

  1. Sono un PITA da scrivere.

  2. Spesso sembrano quasi uguali alle lettere inglesi. Questo è lo stesso motivo per cui odio vedere le lettere greche in notazione matematica. Prova a distinguere rho da p. Non è facile.


6
Dipende da cosa stai usando per digitarli.
endolito

4

In questo caso, una formula matematica complessa, direi di provarci.

Posso dire che in 20 anni non ho mai dovuto codificare qualcosa di così complesso e le lettere greche lo tengono vicino alla matematica originale. Se non riesci a capirlo, non dovresti mantenerlo.

Detto questo, se mai per mantenere μ e σ nella palude codice standard che mi ha lasciato in eredità, io voglio sapere dove vivi ...


3
  • Pro: sembra carino
  • Contro: i caratteri unicode e quindi l'intero significato potrebbe perdersi nella catena degli strumenti (editor, formattatore di codice, controllo della versione, compilatore più vecchio)

Quanto è grande il rischio per te? Il guadagno supera il rischio?


2
Catena utensili? Quale catena di utensili?
badp

2
Editor, formattatore di codice, controllo della versione, compilatore più vecchio. Ogni strumento e persona che tocca il tuo file. Ho avuto una brutta esperienza con strumenti che rovinano file Unicode, YMMV.
LennyProgrammers

2

A volte in un futuro non troppo lontano, useremo tutti editor di testo / IDE / browser Web che faciliteranno la scrittura di testi di modifica inclusi caratteri greci classici, ecc. (O forse avremo tutti imparato a usare questo "nascosto "funzionalità negli strumenti che attualmente utilizziamo ...)

Ma fino a quando ciò non accadrà, i caratteri non ASCII nel codice sorgente del programma sarebbero difficili da gestire per molti programmatori, e sono quindi una cattiva idea se si stanno scrivendo applicazioni che potrebbero dover essere gestite da qualcun altro.

(Per inciso, il motivo per cui puoi avere caratteri greci ma non segni di radice quadrata negli identificatori Python è semplice. I caratteri greci sono classificati come Lettere Unicode, ma il segno di radice quadrata è una non lettera; vedi http://www.python.org / dev / peps / pep-3131 / )


Penso che sarebbe una grande idea creare un IME in grado di tradurre caratteri per gli utenti che non possono inserirli direttamente.
AndrejaKo

Sì, più o meno quando saremo passati a DVORAK. :(
badp,

1
@AndrejaKo Linux ha un IME che accetta i comandi in stile LaTeX - cioè, digiti \mue inserisce µ.
badp

@badp Grazie mille! Lo proverò al prossimo avvio!
AndrejaKo

Emacs supporta numerosi metodi di input che rendono semplice la digitazione dei simboli Unicode. (Incluso un TeX che è quello che uso.) Emacs non è affatto futuristico. (Si è impressionante, ovviamente.)
Tikhon Jelvis

2

Non hai detto quale lingua / compilatore stai usando, ma di solito la regola per i nomi delle variabili è che devono iniziare con un carattere alfabetico o un trattino basso e contenere solo caratteri alfanumerici e di sottolineatura. Un Unicode √ non sarebbe considerato alfanumerico, poiché è un simbolo matematico anziché una lettera. Comunque σ potrebbe essere (dato che è in alfabeto greco) e á sarebbe probabilmente considerato alfanumerico.


1

Ho pubblicato lo stesso tipo di domanda su StackOverflow

Penso sicuramente che valga la pena usare unicode in gravi problemi matematici, perché rende possibile leggere direttamente la formula, cosa impossibile con la semplice ASCII.

Immagina una sessione di debug: ovviamente puoi sempre scrivere a mano la formula che il codice dovrebbe calcolare per vedere se è corretta. Ma il novanta percento delle volte, non ti preoccuperai e il bug può rimanere nascosto per molto tempo. E nessuno è mai disposto a guardare questa formula ASCII semplice a 7 righe. Ovviamente, usare unicode non è buono come una formula renderizzata in tex, ma è molto meglio.

L'alternativa dell'uso di nomi descrittivi lunghi non è praticabile perché in matematica, se l'identificatore non è breve, la formula sembrerà ancora più complicata (perché pensi che le persone, intorno al XVIII secolo, iniziarono a sostituire "più" con "+" e "meno" di "-"?).

Personalmente, userei anche alcuni subscript e superscripts (li copio e li incollo da questa pagina ). Ad esempio: (aveva permesso a Python √ come identificatore)

√ = math.sqrt #function alias
c² = c**2
σʷ² = σʷ**2
γ² = γ**2
σ′ʷ = √(σʷ² * (1 - (σʷ²/c²)*Wʷⁱⁿ(t, e)) + γ²)

Dove ho usato apici perché non esiste un equivalente di pedice in Unicode. (Sfortunatamente, il set di caratteri di sottoscrizione unicode è molto limitato. Spero che un giorno la sottoscrizione in unicode venga considerata come segni diacritici, cioè una combinazione di un carattere per il pedice e un altro carattere per la lettera sottoscritta)

Un'ultima cosa, penso che questa conversazione sull'uso di caratteri non ASCII sia principalmente di parte, perché molti programmatori non si occupano mai di "notazioni matematiche ad alta intensità di formula". Quindi pensano che questa domanda non sia così importante, perché non hanno mai sperimentato una porzione significativa di codice che richiederebbe l'uso di identificatori non ASCII. Se sei uno di loro (e lo ero fino a poco tempo fa), considera questo: supponi che la lettera "a" non faccia parte di ASCII. Quindi avrai una buona idea del problema di non avere nessuna lettera greca, pedice o apice durante il calcolo di formule matematiche non banali.


0

Questo codice è solo per il tuo progetto personale? Se è così, impazzisci, usa quello che vuoi.

Questo codice è destinato ad essere utilizzato da altri? cioè, e un'app open source di qualche tipo? In tal caso, probabilmente stai solo chiedendo problemi perché programmatori diversi usano editor diversi e non puoi essere certo che tutti gli editor supporteranno correttamente Unicode. Inoltre, non tutte le shell dei comandi lo mostreranno correttamente quando il file del codice sorgente è digitato / cat, e potresti incorrere in problemi se è necessario visualizzarlo in HTML.


0

personalmente sono motivato a considerare i linguaggi di programmazione come uno strumento per i matematici in questo contesto, poiché in realtà non uso la matematica che assomiglia a qualcosa del genere nella mia vita. : D E certo, perché non usare ɛ o σ o altro - in quel contesto, in realtà è più leggibile.

(Anche se, devo dire, la mia preferenza sarebbe quella di supportare numeri in apice come chiamate di metodo dirette, non nomi di variabili. Es. 2² = 2 ** 2 = 4, ecc.)


-2

Che diavolo è σ, che Wcos'è ε, cche cos'è e che cos'è γ?
Devi nominare le tue variabili in un modo che spieghi quale sia il loro scopo.
Personalmente avrei picchiato chiunque volesse lasciare Unicode o la versione ASCII per me, anche se la versione ASCII è migliore.

Ciò che è malvagio è chiamare variabili σo so sigmao valueo var1, perché questo non trasmette alcuna informazione.

Supponendo che tu scriva il tuo codice in inglese (come credo che dovresti ovunque tu sia), ASCII dovrebbe essere sufficiente a dare alle tue variabili nomi significativi, quindi non c'è bisogno reale di Unicode.


2
cosa succederebbe se facesse una copia / incolla della carta e poi facesse parte del suo codice sorgente come commento nonostante i nomi delle variabili di un carattere?
Brian

19
Molti di questi nomi di variabili hanno significati forti per coloro che hanno familiarità con il dominio problematico. Per qualcuno che abbia familiarità con il dominio, i nomi inglesi potrebbero essere meno leggibili dei nomi come sigma o rho.
dsimcha,

3
Temo che qualcosa del genere rank_error_with_99_pct_confidencesia un po 'troppo lungo per questo e non renderebbe le formule più facili da capire. AllegSkill / TrueSkill chiamano quei sigma, quindi credo che sia perfettamente accettabile da parte mia mantenere il nome specifico di dominio che hanno.
badp

3
@badp: i buoni nomi sono concisi e descrittivi; ma non deve essere completamente descrittivo. Per il tuo sigma, è perfettamente buono da usare rank_errore mettere i dettagli extra circa il 99 percento di fiducia nella documentazione / commento da qualche parte.
Lie Ryan,

1
@dsimcha: penso che quelli che hanno familiarità con un determinato dominio siano significativamente più rari di quelli che non ne hanno mai sentito parlare. E penso che quelli che hanno familiarità con il dominio saranno in grado di far fronte a semplici nomi inglesi, mentre quelli che non lo conoscono saranno completamente incapaci di capire cosa sta accadendo se tutto è offuscato dalle variabili greche di una lettera.
back2dos

-2

Per nomi di variabili con origini matematiche ben note ciò è assolutamente accettabile, persino preferito. Ma se mai ti aspetti di distribuire il codice, dovresti inserire questi valori in un modulo, una classe, ecc. In modo che il completamento automatico dell'IDE possa gestire "digitando" gli strani caratteri.

Usare √ o ² in un identificatore - non tanto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.