Strange error with unbound method

Fernando Rodríguez spamers at must.die
Mon Apr 16 12:26:17 EDT 2001


Hi!

	I have a class called ParaStyle (see code below). This class has a
method called makeBlackAndWhite that returns a new instance of class
ParaStyle.

	I want to transform a list of ParaStyle instances into a list of the
result of applying the makeBlackAndWhite method of each instance.

	If I do:
paraStyles = map( ParaStyle.makeBlackAndWhite, paraStyles )

I get the following error:
TypeError: unbound method must be called with class instance 1st argument

While if I do it with a for loop:
l = []
for para in paraStyles:
    l.append( para.makeBlackAndWhite() )

I dont get any error!  =:-O

What's going on???? O:-)

-----------ParaStyle Class-------------------
class ParaStyle(BaseObject):
    """Contiene toda la info sobre un estilo de párrafo: el estilo
    de sus caracteres (una instancia de un CharStyle), su alineación,
    el 'leading' o separación entre lineas, el indentado (una instancia
    de algna de las siguientes clases: NullIndent (sin indentado),
    NormalIndent, FrenchIndent o FirstLineIndent)y cual
    es el siguiente."""

    # Tipos de alineación
    alignment = { 'left': '\ql',
                  'right': '\qr',
                  'centered': '\qc',
                  'justified': '\qj',
                  'none' : ''}

    # Tipos de separación (leading)
    leading = { 1:'',
                1.5:"\sl360\slmult1",
                2:"\sl480\slmult1" }

    
    # TODO: debe de comprobar que los parámetros alignment,
    # y leading son del tipo correcto. Sino, debe de
    # levantar una excepción
    # Si no es por omisión (no contiene la palabra default o
    # normal) y no tiene basedOn, probablemente sea un
    # error. Avisar.

    def __init__( self,
                  names,
                  charStyle = NullCharStyle(),
                  next = NullParaStyle(),
                  basedOn = NullParaStyle(),
                  indent = NullIndent(),
                  alignment = 'none',
                  leading = 1 ):


        if not alignment in ParaStyle.alignment.keys():
            raise UnknownAlignment, str( alignment ) + ' isn`t a valid
alignment'

        if not leading in ParaStyle.leading.keys():
            raise UnknownLeading, str( leading ) + ' isn`t a valid leading'
        
        if not names[0] == 'default' and basedOn.__class__ == NullParaStyle:
                raise NoParent, str( names ) + ' has no basedOn. ' + \
                      'Since it`s not the default one, it must have a basedOn'

        self.names = names
        self.basedOn = basedOn

        # si no se indica un next, ha de apuntar a sí mismo
        if next.__class__ == NullParaStyle:
            self.next = self
        else:
            self.next = next
        
        # Hacemos la herencia de next, indent, alignment y leading
        # en el momento de construir la instancia

        if basedOn.__class__ == NullParaStyle:
                       
            self.alignment = alignment
            self.indent = indent
            self.leading = leading
            self.charStyle = charStyle

        else:

            if charStyle.__class__ == NullCharStyle:
                self.charStyle = basedOn.charStyle
            else:
                self.charStyle = charStyle
            
            
            if alignment == 'none':
                self.alignment = basedOn.alignment
            else:
                self.alignment = alignment

            if indent.__class__ == NullIndent:
                self.indent = basedOn.indent
            else:
                self.indent = indent

            if leading == 1:
                self.leading = basedOn.leading
            else:
                self.leading = leading
    
            



    def makeBlackAndWhite( self ):
        """Versión en blanco y negro del formato

        ¡¡Ojo!! Si el next es self, tenemos un poblema: para construir
        un BW, necesitamos previamente ese BW para pasarlo al constructor.
        Esto causaría un bucle sin fin. Para evitarlo, construimos
        primero una versión parcial sin el next, y luego le añadimos una
        ref a sí mismo.
        """

        if self.next == self:
            partial = ParaStyle( names = self.names,
                                 charStyle =
self.charStyle.makeBlackAndWhite(),
                                 basedOn = self.basedOn.makeBlackAndWhite(),
                                 indent = self.indent.makeBlackAndWhite(),
                                 leading = self.leading,
                                 alignment = self.alignment )
            partial.next = partial
            return partial
        else:
            return ParaStyle( names = self.names,
                              charStyle = self.charStyle.makeBlackAndWhite(),
                              basedOn = self.basedOn.makeBlackAndWhite(),
                              next = self.next.makeBlackAndWhite(),
                              indent = self.indent.makeBlackAndWhite(),
                              leading = self.leading,
                              alignment = self.alignment )
    






//-----------------------------------------------
//	Fernando Rodriguez Romero
//
//	frr at mindless dot com
//------------------------------------------------



More information about the Python-list mailing list