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?
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?
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.
+1. Fortunatamente per noi sviluppatori di Ruby, p erformante non è una parola. (Siamo spiacenti, siamo così semantici!): D – wuputah
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. –
@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? –
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'} @ –
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
@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 –
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",
)
ironicamente, questa soluzione, almeno all'inizio, ti limita ad avere stringhe come le chiavi. – aaronasterling
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. –
come un tipo di prima classe ma non esiste https://pypi.python.org/pypi/SymbolType.
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.
Ottima risposta! Grazie per aver esaminato questo. –
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