Чи існує Python, еквівалентний символам Ruby?


76

Чи існує Python, еквівалентний символам Ruby?

  • Якщо так, то що це?

  • Якщо ні, то ми застрягли з використанням рядків як наших ключів лише у словниках?


4
Слідом за ваш коментар до цієї відповіді нижче : Якщо ви хочете що - то , де ви можете ввести d.bзамість d['b'], ви могли б просто використовувати порожній , class D(object): passщоб створити екземпляр , d = D()до якого ви можете призначити свої значення атрибутів , які складають, наприклад , так d.a=1і d.b=2і Звичайно, отримуйте їх значення так print(d.a + d.b). Не впевнений, що це буде повільніше, ніж звичайний пошук словника, як d['b']у відповіді.
FriendFX

Крім того, якщо вам потрібна унікальна константа, тип даних якої не є рядком, ви також можете використовувати для цього власні класи
Alexander Bird

Відповіді:


76

Ні, python не має типу символу.

Однак рядкові літерали інтернуються за замовчуванням, а інші рядки можна інтернувати за допомогою internфункції. Отже, використання рядкових літералів як ключів у словниках є не менш ефективним, ніж використання символів у ruby.


20
+1. На щастя для нас, розробників Ruby, продуктивність - це не слово. (Вибачте, ми просто такі семантичні!): D
wuputah

10
Найголовніша перевага цього полягає в тому, що мова має один менший основний синтаксис і вбудований тип. Це зайва складність мови, коли це можна зробити прозоро.
Гленн Мейнард,

@Glenn Спочатку я був засмучений, почувши, що Python не має символів і що рядкові літерали можна використовувати як ключі. Проблема в тому, що я не задоволений тим фактом, що мені доведеться розміщувати лапки навколо всіх своїх ключів. Чи є спосіб обійти це?

1
@ J3M 7OR3: Ні, звичайно, ніяк цього не обійти. Але враховуйте: це лише один додатковий символ, і в реальному коді ви часто використовуєте змінні замість буквальних ключів.

12
@delnan, звичайно, є спосіб обійти це: dict (a = 1, b = 2, c = 3).
Ned Batchelder

20

Як сказали інші, в Python немає символу, але рядки працюють добре.

Щоб уникнути цитування рядків як ключів, використовуйте синтаксис конструктора dict ():

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

1
як не дивно, це рішення має , по крайней мере , на початковому етапі, обмежує вас до наявності рядка в якості ключів.
aaronasterling

так, це обхід, але лише під час етапу призначення. я все одно повинен додати лапки навколо b у d ['b'], щоб отримати його значення. мабуть, я просто пам’ятаю, як рубінові символи легше друкувати. я хотів би, щоб був модуль, який вирішив цю проблему. Цікаво, чи не змусило б програму працювати повільніше.

13

Також для тих, хто цікавиться: символи в 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.


Чудова відповідь! Дякуємо, що вивчили це.
Джуно Вудс

7
  1. Ні, еквівалента немає.
  2. Ні, ви можете використовувати кожен хеш-об'єкт як ключ словника.

Чи можна присвоїти змінну рядковий літерал, а потім використовувати цю змінну як ключ. наприклад апельсин = 'апельсин "food_type = {апельсин:' фрукт ', банан:' фрукт '}

@ J3M 7OR3: Рядки можна хешувати! Як і всі незмінні типи. Щодо другого питання ... Python не є Javascript - ключі в літералах dict не є особливими. Вони можуть бути будь-якими виразами (змінними, літералами, ...), обчислюються і результат використовується як ключ. Так що так, це працює.

@delnan Добре. Але чи використовується змінна замість рядкового літералу як ключова найкраща практика? Чи зазвичай люди роблять це? Або їм добре з використанням просто рядкових літералів (із цитатами) як ключів?

1
@ J3M 7OR3: Ват? Найчастіше ви не можете знати ключ до моменту написання програми. Звичайно, k = "key"; d[k] = "value"це дурно (але ні for k in keys: d[k] = "default", хоча є кращі способи), але, як уже було сказано, більшу частину часу ви використовуєте значення часу виконання як ключі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.