2010-09-18 11 views
60

Esiste un equivalente Python simboli di Ruby?Esiste un equivalente Python simboli di Ruby?

  • Se sì, allora che cos'è?

  • Se poi non stiamo bloccati con l'utilizzo di stringhe come i nostri chiavi in soli dizionari?

+3

Seguito del commento a [questa risposta di seguito] (http://stackoverflow.com/a/3743919/897968): Se desideri qualcosa in cui puoi digitare 'db' invece di' d ['b'] ', potresti semplicemente usare una' classe D vuota (oggetto): pass' per creare un'istanza 'd = D()' alla quale puoi quindi assegnare i tuoi valori agli attributi che componi, come ad esempio 'd.a = 1' e 'd.b = 2' e naturalmente ottengono i loro valori come' print (d.a + d.b) '. Non sono sicuro che sarebbe più lento di un semplice dizionario come il 'd ['b']' nella risposta. – FriendFX

risposta

66

No, Python non ha un tipo di simbolo.

Tuttavia stringhe letterali sono internati per impostazione predefinita e altre stringhe possono essere internati utilizzando la funzione intern. Quindi usare le stringhe letterali come chiavi nei dizionari non è meno performante dell'uso dei simboli in ruby.

+11

+1. Fortunatamente per noi sviluppatori di Ruby, p erformante non è una parola. (Siamo spiacenti, siamo così semantici!): D – wuputah

+7

Il vantaggio principale di questo è che il linguaggio ha una sintassi di core e un tipo di builtin in meno. È una complessità non necessaria nella lingua quando può essere eseguita in modo trasparente. –

+0

@Glenn All'inizio ero sconvolto nel sentire che Python non aveva simboli e che i letterali stringa possono essere usati come chiavi. Il problema è che non sono contento del fatto che dovrò collocare le virgolette su tutte le mie chiavi. C'è un modo per aggirare questo? –

6
  1. No, non esiste un equivalente.
  2. Non è possibile utilizzare ogni oggetto hashable come chiave di dizionario.
+0

Si può assegnare una stringa letterale a una variabile e quindi usare quella variabile come chiave. per esempio. !. arancione = 'orange" food_type = {orange: 'frutta', banana: 'frutta'} @ –

+0

J3M 7OR3: Le stringhe sono hashable come lo sono tutti i tipi immutabili Per quanto riguarda la seconda domanda ... Python non è Javascript - chiavi in ​​dict letterali non sono speciali. possono essere qualsiasi espressione (una variabile, un letterale, ...), vengono valutati ed il risultato viene utilizzato come chiave. Quindi sì, questo funziona. – delnan

+0

@delnan Ok. Ma sta usando una variabile, invece ? di una stringa letterale, come best practice chiave do la gente di solito fanno O sono bene con utilizzando solo stringhe letterali (con i loro virgolette) come tasti –

15

Come altri hanno detto, non c'è nessun simbolo in Python, ma le stringhe funzionano bene.

Per evitare citando le stringhe come chiavi, utilizzare il dict() costruttore di sintassi:

d = dict(
    a = 1, 
    b = 2, 
    c = "Hello there", 
    ) 
+1

ironicamente, questa soluzione, almeno all'inizio, ti limita ad avere stringhe come le chiavi. – aaronasterling

+0

sì, è un problema, ma solo durante la fase di assegnazione. Devo ancora aggiungere delle virgolette su b in d ['b'] per ottenere il suo valore. Immagino di ricordare che i simboli rubino sono più facili da digitare. Vorrei che ci fosse un modulo che ha risolto questo problema. mi chiedo se sarebbe comunque il programma a rallentare. –

8

Anche per chi è interessato: i simboli in Ruby utilizzati in un hash sono molto simili agli oggetti vuoti in python. Per esempio si potrebbe fare:

some_var = object() 

e quindi impostare una chiave di dizionario come some_var:

some_dict = { some_var : 'some value' } 

e poi fare un recupero di serie:

some_dict[some_var] 

Tuttavia, come sepp2k notato c'è nessun vantaggio in termini di prestazioni. In realtà ho fatto un test rapido e notato poco o nessun aumento delle prestazioni:

a, b, c, d, e = [object() for _ in range(5)] 
dict_symbols = {a : 'a', b : 'b', c : 'c', d : 'd', e : 'e'} 
dict_strings = {'a' : 'a', 'b' : 'b', 'c' : 'c', 'd' : 'd', 'e' : 'e'} 

def run_symbols(): 
    for key in dict_symbols.keys(): 
     dict_symbols[key] 

def run_strings(): 
    for key in dict_strings.keys(): 
     dict_strings[key] 

Velocità testata in ipython:

In [3]: %timeit run_symbols 
10000000 loops, best of 3: 33.2 ns per loop 

In [4]: %timeit run_strings 
10000000 loops, best of 3: 28.3 ns per loop 

Quindi, nel mio caso la corsa 'simboli' più lento! (per numeri divertenti, non precisi). Tuttavia è da notare che probabilmente ci sono dei vantaggi di memoria nel farlo in questo modo. Se non ti interessa il tipo di chiave, gli oggetti hanno un ingombro minore delle stringhe.

import sys 
sys.getsizeof('some_var') # 45 
some_var = object() 
sys.getsizeof(some_var) # 0 

Sebbene ciò sollevi la questione di come Python tratti la memoria del nome variabile some_var.

+0

Ottima risposta! Grazie per aver esaminato questo. –