it-swarm.it

È male usare i caratteri Unicode nei nomi delle variabili?

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

Ecco come appare la matematica:

alt text

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 sia sfortunato Python 3 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 ASCII? Perché? ASCII solo la versione precedente può essere 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, la ASCII solo la versione 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.

84
badp

Sento fortemente che la semplice sostituzione di σ con s o sigma sarebbe stupido, al limite del 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, normalmente non è così, quindi facciamo ricorso a variabili di una lettera, rendendole occasionalmente greche.

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

Quindi, o mantieni la notazione originale ... dopo tutto, se il linguaggio di programmazione fa supporta Unicode negli identificatori, quindi non c'è barriera tecnica. O usa identificatori significativi. Non sostituire semplicemente i glifi greci con glifi latini. O quelli arabi o hindi.

54
Konrad Rudolph

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, danneggia davvero 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 in alto //µ = u e scrivere tutto in ascii?

34
TheLQ

Questo argomento presuppone che non ci 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 appreso di 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 pi o π è, tranne Non ho imparato questa formula nella scuola elementare. winner_sigma e Wwin non significano nulla per me o per chiunque altro legga il codice e non usi né σw non lo rende migliore.

Quindi, usando nomi descrittivi, ad es. total_score, winning_ratio, ecc aumenterebbe la leggibilità molto meglio dell'uso 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.

Sicuramente hai capito tu stesso il problema quando hai 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 a lettera singola 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 / 2 e alpha * beta / 2 sono un rendering ugualmente opaco di height * base / 2, la formula dell'area triangolare. La illeggibilità dell'uso di variabili a lettera singola aumenta 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 di una lettera ascii, non mi interessa; nessun'altra variabile dovrebbe consistere esclusivamente in una singola lettera. Non mi importa 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 sono 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.

31
Lie Ryan

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.

14
user4051

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.

9
zvrba

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.

5
dsimcha

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 dovessi mai mantenere µ e σ nel codice standard della palude che mi hai lasciato in eredità, io lo scoprirò dove vivi ...

4
gbn
  • Pro: sembra bello
  • 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?

3

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à, non ASCII caratteri nel codice sorgente del programma sarebbero difficili da gestire per molti programmatori, e sono quindi una cattiva idea se stai scrivendo applicazioni che potrebbero essere gestite da qualcun altro .

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

2
Stephen C

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.

2
tcrosley

Ho pubblicato lo stesso tipo di domanda su StackOverflow

Penso sicuramente che valga la pena usare unicode in gravi problemi di matematica, perché rende possibile leggere la formula direttamente, 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 astrusa a 7 righe, semplice ASCII. Naturalmente, usare unicode non è buono come una formula renderizzata da tex, ma è molto meglio .

L'alternativa all'utilizzo 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 pedici e apici (li copio e li copio da questa pagina ). Ad esempio: (aveva python consentito √ 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.

1
Bérenger

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.)

0
roberto

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

Questo codice è pensato per essere utilizzato da altri? vale a dire, 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 viene digitato/cat, e potresti incorrere in problemi se è necessario visualizzarlo in HTML.

0
GrandmasterB