Есть ли Python, эквивалентный символам Ruby?


есть ли Python, эквивалентный символам Ruby?

  • Если да, то что это такое?

  • Если нет, то мы застряли с помощью строки в нашей ключи в только словари?

5 62

5 ответов:

нет, python не имеет типа символа.

однако строковые литералы являются интернированы по умолчанию и другие строки могут быть интернированы с помощью intern

как говорили другие, в Python нет символа, но строки работают хорошо.

чтобы избежать цитирования строк в качестве ключей, используйте синтаксис конструктора dict ():

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

также для тех, кто заинтересован: символы в Ruby при использовании в хэше очень похожи на пустые объекты в python. Например, вы могли бы сделать:

some_var = object()

а затем установите ключ словаря как some_var:

some_dict = { some_var : 'some value' }

а затем сделать стандартный поиск:

some_dict[some_var]

однако, как отметил sepp2k, в этом нет никакого преимущества для производительности. На самом деле я сделал быстрый тест и отметил мало, чтобы не повысить производительность:

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]

скорость испытания в 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

так что в моем случае "символы" работают медленнее! (для забавных чисел, не точных). Однако следует отметить, что, вероятно, есть преимущества памяти, чтобы сделать это таким образом. Если вы не заботитесь о типе ключа объекты имеют меньший размер, чем строки.

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

хотя это поднимает вопрос о том, как python обрабатывает память имени переменной some_var.

  1. нет, эквивалента нет.
  2. нет вы можете использовать каждый хэшируемый объект в качестве ключа словаря.

не как первоклассный тип, но существует https://pypi.python.org/pypi/SymbolType.