2010-09-18 20 views
60

¿Hay un Python equivalente a los símbolos de Ruby?¿Hay un Python equivalente a los símbolos de Ruby?

  • Si es así, ¿de qué se trata?

  • Si no, entonces se nos limitamos con el uso de cadenas como nuestros teclas sólo en los diccionarios?

+3

Seguimiento de su comentario a [esta respuesta a continuación] (http://stackoverflow.com/a/3743919/897968): Si desea algo donde puede escribir 'db' en lugar de' d ['b'] ', puedes usar una' clase D 'vacía (objeto): pasar' para crear una instancia 'd = D()' a la que luego puedes asignar tus valores a los atributos que creas, como por ejemplo 'd.a = 1' y 'd.b = 2' y, por supuesto, obtener sus valores como' imprimir (d.a + d.b) '. No estoy seguro de si eso sería más lento que una búsqueda en un diccionario simple como 'd ['b']' en la respuesta. – FriendFX

Respuesta

66

No, python no tiene un tipo de símbolo.

Sin embargo, los literales de cadena se internan por defecto y otras cadenas se pueden internar utilizando la función intern. Por lo tanto, el uso de literales de cadena como claves en los diccionarios no es menos eficaz que el uso de símbolos en ruby.

+11

+1. Afortunadamente para nosotros los desarrolladores de Ruby, p erformant no es una palabra. (¡Lo sentimos, somos tan semánticos!): D – wuputah

+7

El mayor beneficio de esto es que el lenguaje tiene una sintaxis central y un tipo incorporado. Es una complejidad innecesaria en el lenguaje cuando se puede hacer de forma transparente. –

+0

@Glenn Al principio me molestó escuchar que Python no tenía símbolos y que los literales de cadena se pueden usar como claves. El problema es que no estoy contento con el hecho de que tendré que poner comillas alrededor de todas mis llaves. ¿Hay alguna forma de evitar esto? –

6
  1. No, no existe un equivalente.
  2. No, puede usar todos los objetos hashable como clave de diccionario.
+0

¿Se puede asignar un literal de cadena a una variable y luego usar esa variable como clave? p.ej. orange = 'orange' food_type = {orange: 'fruit', banana: 'fruit'} –

+0

@ J3M 7OR3: ¡Las cadenas son aptas! Como todos los tipos inmutables. En lo que respecta a la segunda pregunta ... Python no es Javascript - teclas en dict los literales no son especiales. Pueden ser cualquier expresión (una variable, un literal, ...), se evalúan y el resultado se usa como clave. Así que sí, esto funciona. – delnan

+0

@delnan Ok. Pero está usando una variable, en cambio de un literal de cadena, como una mejor práctica clave? ¿Las personas suelen hacer esto? ¿O están bien con el uso de cadenas literales (con sus comillas) como claves? –

15

Como han dicho otros, no hay ningún símbolo en Python, pero las cadenas funcionan bien.

Para evitar citar cadenas como claves, utilice la sintaxis constructor dict():

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

irónicamente, esta solución _sea_, al menos inicialmente, le restringe a tener cadenas como las teclas. – aaronasterling

+0

Sí, es un trabajo alternativo, pero solo durante el paso de asignación. Todavía tengo que agregar comillas alrededor de b en d ['b'] para obtener su valor. Supongo que solo recuerdo que los símbolos de rubí son más fáciles de escribir. Ojalá hubiera un módulo que resolvió este problema. Me pregunto si haría que el programa corriera más lento. –

8

También para aquellos interesados: los símbolos en Ruby cuando se usan en hash son muy similares a los objetos vacíos en python. Por ejemplo, usted podría hacer:

some_var = object() 

a continuación, establecer una clave de diccionario como una_variable:

some_dict = { some_var : 'some value' } 

y luego hacer una recuperación estándar:

some_dict[some_var] 

Sin embargo, como sepp2k señalar que hay sin beneficio de rendimiento al hacer esto. De hecho hice una prueba rápida y señaló poco o ningún aumento de rendimiento: prueba

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] 

velocidad 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 

Así que en mi caso la carrera 'símbolos' más lento! (para números divertidos, no precisos). Sin embargo, debe tener en cuenta que probablemente haya ventajas de memoria para hacerlo de esta manera. Si no te importa el tipo de letra, los objetos tienen una huella más pequeña que las cadenas.

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

Aunque eso plantea la cuestión de cómo python trata la memoria del nombre de la variable some_var.

+0

¡Gran respuesta! Gracias por mirar en esto. –

Cuestiones relacionadas