2012-04-28 7 views
19

proszę, czy ktoś może mi pomóc z kodem poniżej? Kiedy go uruchomić dzienniki powiedział:Co generuje "odwzorowanie znaków TypeError musi zwracać liczbę całkowitą ..." w tym kodzie Pythona?

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 - 

wiem, że błąd musi być w ROT13(). Ale kiedy uruchomię tę procedurę w IDE, działa normalnie.

Oto mój kod:

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) 

Dzięki z góry za wszelką pomoc!

+0

Nie mogę odtworzyć za pomocą kodu i danych wejściowych (przy użyciu 64-bitowego EPD Python 2.7.2 w systemie Linux). Być może mógłbyś dołączyć mały kompletny przykład, który Ci się nie udał i z którym mogliśmy eksperymentować? – NPE

+0

Dzięki, aix. Myślę, że Andrew odkrył przyczynę. (tekst jest wprowadzany jako Unicode). Czy wiesz, jak to naprawić? – craftApprentice

Odpowiedz

35

To prawdopodobnie dlatego, że tekst jest wpisany jako 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 
>>> 

To pytanie dotyczy tego, co trzeba:

Jeżeli jesteś pewien, że ciągi znaków Unicode aren Ważne jest, że mógłbyś po prostu:

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

Dzięki, Andrew, myślę, że masz rację. Jak to naprawić? – craftApprentice

+0

zaktualizowano o więcej informacji –

+0

Dzięki, Andrew. Bardzo mi pomogłeś. – craftApprentice

Powiązane problemy