[Zope-es] Indexar un campo multiValued

Andres Moya Andres.Moya en hispalinux.es
Lun Dic 19 11:17:39 CET 2005


>Garito escribió:
>
>  Puedes usar same_type asi
>
>  if same_type(tuvariable, list()): # es lista elif
>  same_type(tuvariable, str('')): # es string

Bueno, al final he usado esto y parece que funciona muy bien:

  <span tal:content="python: same_type(mi_variable, []) and ', 
'.join(mi_variable) or mi_variable">
    xxx
  </span>

Lo del python restringido, la verdad es que lo entiendo, tiene sentido 
como medida de seguridad y la mayor parte de las veces hay alternativas 
más o menos sencillas. Lo que pasa es que hay que leerse el manual y a 
veces las cosas están un poco escondidas, esto del same_type no lo había 
encontrado hasta que me lo habéis dicho:

http://www.plope.com/Books/2_7Edition/BasicScripting.stx#2-15


Por cierto, ya que estamos voy a contar algo que me ha recordado, por si 
a alguien le interesa: esto funciona cuando la variable es una lista, 
pero no si es una tupla o una clase especial. En mi caso está bien así, 
pero recuerdo que hace tiempo estuve buscando una manera genérica de 
distinguir una secuencia de un elemento escalar, y no era fácil, porque 
un string para python es una secuencia, pero en mi caso lo tenía que 
manejar como un átomo, y la cosa se complica los diferentes tipos de 
strings. Encontré esto en un sitio de recetas, pero lamentablemente no 
apunté la dirección. Es feo pero creo que funciona para todos los casos, 
incluso para tipos nuevos:


def atom_to_sequence(x):
    """Convert an object into a sequence, unless it's already so.

    A sequence is defined as an object wich has a 'len', and that
    is not a string. An atom is defined as an object that is not a
    sequence.
    """
    if is_atom(x):
        return (x,)
    else:
        return x


def is_atom(x):
    """Check if an object is an atom or a sequence.

    A sequence is defined as an object wich has a 'len', and that
    is not a string. An atom is defined as an object that is not a
    sequence.
    """
    try:
        x + ''      # check for a string
        return True
    except TypeError:
        try:
            len(x)  # check for a sequence
            return False
        except TypeError:
            return True

-- 
Andres.Moya en hispalinux.es




Más información sobre la lista de distribución Python-es