Existe-t-il un Python équivalent à Ruby symboles?)
Si oui, qu'est-ce que c'est?
Sinon, sommes-nous obligés d'utiliser chaînes comme clés dans les dictionnaires uniquement?
Non, python n'a pas de type de symbole.
Cependant, les littéraux de chaîne sont internés par défaut et d'autres chaînes peuvent être internées à l'aide de la fonction intern
. Ainsi, l'utilisation de littéraux de chaîne comme clés dans les dictionnaires n'est pas moins performante que l'utilisation de symboles dans Ruby.
Comme d'autres l'ont dit, il n'y a pas de symbole en Python, mais les chaînes fonctionnent bien.
Pour éviter de citer des chaînes comme clés, utilisez la syntaxe du constructeur dict ():
d = dict(
a = 1,
b = 2,
c = "Hello there",
)
Aussi pour ceux qui sont intéressés: les symboles en Ruby lorsqu'ils sont utilisés dans un hachage sont très similaires aux objets vides en python. Par exemple, vous pouvez faire:
some_var = object()
puis définissez une clé de dictionnaire comme some_var:
some_dict = { some_var : 'some value' }
puis effectuez une récupération standard:
some_dict[some_var]
Cependant, comme l'a noté sepp2k, cela ne présente aucun avantage en termes de performances. En fait, j'ai fait un test rapide et noté peu ou pas d'augmentation des performances:
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]
Test de vitesse en 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
Donc, dans mon cas, les "symboles" fonctionnent plus lentement! (pour les nombres amusants, pas précis). Cependant, il est à noter qu'il y a probablement des avantages de mémoire à le faire de cette façon. Si vous ne vous souciez pas du type de clé, les objets ont une empreinte plus petite que les chaînes.
import sys
sys.getsizeof('some_var') # 45
some_var = object()
sys.getsizeof(some_var) # 0
Bien que cela soulève la question de savoir comment python traite la mémoire du nom de variable some_var.
Pas en tant que type de première classe mais il existe https://pypi.python.org/pypi/SymbolType .