2012-04-28 8 views
19

por favor, ¿alguien me puede ayudar con el código de abajo? Cuando lo ejecuto los registros dijo:¿Qué está produciendo "la asignación de caracteres TypeError debe devolver un entero ..." en este código python?

return method(*args, **kwargs) 
    File "C:\Users\CG\Documents\udacity\rot13serendipo\main.py", line 51, in post 
    text = rot13(text) 
    File "C:\Users\CG\Documents\udacity\rot13serendipo\main.py", line 43, in rot13 
    return st.translate(tab) 
TypeError: character mapping must return integer, None or unicode 
    INFO  2012-04-28 20:02:26,862 dev_appserver.py:2891] "POST/HTTP/1.1" 500 - 

Sé que el error debe estar en rot13(). Pero cuando ejecuto este procedimiento en el IDE, funciona normalmente.

Aquí mi código:

import webapp2 

form= """ 
    <html> 
    <head> 
    <title>Unit 2 Rot 13</title> 
    </head> 

    <body> 
    <h2>Enter some text to ROT13:</h2> 
    <form method="post"> 
     <textarea name="text" 
       style="height: 100px; width: 400px;"></textarea> 
     <br> 
     <input type="submit"> 
    </form> 
    </body> 

    </html> """ 

def rot13(st): 
    import string 
    tab1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 
    tab2 = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM' 
    tab = string.maketrans(tab1, tab2) 
    return st.translate(tab) 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.out.write(form) 

    def post(self): 
     text = self.request.get("text") 
     text = rot13(text) 
     self.response.out.write(text) 


app = webapp2.WSGIApplication([('/', MainHandler)], 
          debug=True) 

Gracias de antemano por cualquier ayuda!

+0

No puedo reproducir con su código y su entrada (usando EPD Python 2.7.2 de 64 bits en Linux). ¿Quizás podría incluir un pequeño ejemplo completo que falla para usted y con el que podríamos experimentar? – NPE

+0

Gracias, aix. Creo que Andrew descubrió la causa. (el texto se ingresa como unicode). ¿Sabes cómo lo arreglo? – craftApprentice

Respuesta

35

Es probablemente debido a que el texto está siendo introducido como Unicode:

>>> def rot13(st): 
...  import string 
...  tab1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 
...  tab2 = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM' 
...  tab = string.maketrans(tab1, tab2) 
...  return st.translate(tab) 
... 
>>> rot13('test') 
'grfg' 
>>> rot13(u'test') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 6, in rot13 
TypeError: character mapping must return integer, None or unicode 
>>> 

Esta pregunta cubre lo que necesita:

Si está seguro de que las cadenas Unicode aren 't importante, supongo que podría simplemente:

return str(st).translate(tab) 
+0

Gracias, Andrew, creo que tienes razón. ¿Cómo arreglo eso? – craftApprentice

+0

actualizado con más información –

+0

Gracias, Andrew. Me has ayudado mucho, mucho. – craftApprentice

Cuestiones relacionadas