[Python] It's 1999 all over again
Daniele Varrazzo
piro a develer.com
Gio 13 Feb 2014 17:03:30 CET
On 2014-02-13 15:22, Manlio Perillo wrote:
> On 13/02/2014 16:07, Daniele Varrazzo wrote:
>> - sei legato all'implementazione del carattere (char, utf16, utf32)
>
> Direi che lo stesso problema è presente, in parte, con Go:
> http://golang.org/ref/spec#String_types
Il problema è risolto dal fatto che hanno dichiarato che le stringhe
sono solo 8 bit e sono solo codificate in utf8, mentre l'accesso ai
codepoint unicode ha un'interfaccia separata. Questo porta alle
conseguenze che:
- sono più efficienti in memoria di utf16/32
- sai che a[n] non è un carattere ma è un byte. La bugia dei widechar
non regge. Neanche quella di unicode in python che però si rompe al di
fuori del BMP (a meno che non lo compili 4 byte per carattere blah blah)
- tipicamente l'i/o non richiede encoding/decoding
- accedere ai codepoint lo fai con interfaccia sequenziale, non con un
array. Se mi ricordo bene (non tocco Go da un anno) ci sono interfacce
che streamano rune partendo da stringhe.
> Quindi direi che le stringhe in Go non sono "vere" stringhe, come in
> Python:
> http://play.golang.org/p/6Q7KoyuEA1
>
> Il programma stampa 6, non 2 come mi sarei aspettato da un linguaggio
> che supporta un tipo builtin per le stringhe.
utf8.RuneCountInString(s) restituisce 2.
Cosa devi sapere più spesso: quanti caratteri contiene una stringa o
quanti byte ne occupa il buffer? Conoscere il numero di caratteri di una
stringa è un'altra operazione largamente sopravvalutata (non scrivi
tutti i giorni un algoritmo per centrare una stringa di caratteri non
proporzionali in uno schermo). Molti algoritmi possono essere espressi
con un'iterazione sull'input che dura fino al verificarsi di una certa
condizione (fine dell'input, o altro): per questi non ti serve la
lunghezza.
Quanti caratteri è lungo:
<html>世界</html>
dipende dal contesto, no? Molte volte 2 è la risposta giusta. In
termini di occupazione 19 è la risposta giusta. 15 è una risposta
interessante? Forse si, ma non mi viente in mente dove. Sia 2 che 15
richiedono una certa quantità di parsing per essere ottenute. Con Python
paghi sempre l'overhead necessario per avere la risposta 15 in o(1), che
ti serva o meno. Se ti serviva 19 dovevi aprire il file in binario ed
usare un'interfaccia radicalmente diversa (str[n] -> str, bytes[n] ->
int). Con Go paghi l'overhead del decoding solo quando serve.
È un linguaggio opinionato: quando incontra gente opinionata può
piacere o non piacere :) Trovo la scelta di avere stringhe solo utf8
molto razionale nel 201x, anche se richiede aggiustamenti mentali
rispetto ad abitudini prese nel 197x. Ma allora non esistevano i cinesi,
né le lettere accentate, né l'€, quindi è comprensibile...
-- Daniele
Maggiori informazioni sulla lista
Python