In python 2 type str means bytes and type unicode means unicode In python 3 class bytes means bytes and class str means unicode.
This is my biggest problem with py3. They changed the meaning of a keyword to mean the opposite of what it did in py2. It makes things really hard to debug. On Friday, 11 October 2019 04:58:40 UTC-7, Lisandro wrote: > > > Also in your json example you are getting unicode both in py2 and py3 > except py3 does not put the u'' in front of unicode strings because they > are default. > > I've used type() to inspect the keys and values of the dictionary in py2 > and py3: > > *py2* > >>> map = pickle.load(open(path, 'rb')) > >>> first_key = list(map.keys())[0] > >>> print(type(first_key)) > <type 'unicode'> > >>> print(type(map[first_key])) > <type 'unicode'> > > > *py3* > >>> map = pickle.load(open(path, 'rb')) > >>> first_key = list(map.keys())[0] > >>> print(type(first_key)) > <class 'str'> > >>> print(type(map[first_key])) > <class 'str'> > > Notice in python3 it says "class" not "type" and it is str, while on > python2 it says unicode :/ > > Anyway, I don't pretend to bother with this issue unrelated to web2py. > My goal is to be able to read/write the dicti to a .pkl file with py2 and > py3, so I'll keep testing and I'll post the solution here if I find it :) > > > > El viernes, 11 de octubre de 2019, 2:52:35 (UTC-3), Massimo Di Pierro > escribió: >> >> I am puzzled by this too. The error is not in web2py code. The error is >> in the string.py module. >> Also in your json example you are getting unicode both in py2 and py3 >> except py3 does not put the u'' in front of unicode strings because they >> are default. >> >> On Thursday, 10 October 2019 18:05:55 UTC-7, Lisandro wrote: >>> >>> I've found the issue, it's not web2py related, sorry about that. >>> >>> My web2py instance has several applications running, each one is >>> attached to a domain. >>> I store a the map of domains:apps in a dictionary that I save to a .pkl >>> file. >>> Then my routes.py reads that file and loads the map of domains:apps >>> >>> I write the .pkl file like this: >>> >>> with open('map.pkl', 'wb') as file: >>> pickle.dump(dictionary_map, file, protocol=2) >>> >>> Notice I use protocol=2 because I want to be able to read/write the file >>> with python 2 and 3. >>> >>> In my routes.py I read the file like this: >>> >>> map = pickle.load(open('domains_apps.pkl', 'rb')) >>> >>> routers = dict( >>> BASE=dict( >>> default_controller='default', >>> default_function='index', >>> domains=map, >>> map_static=True, >>> exclusive_domain=True, >>> ) >>> ) >>> >>> >>> >>> However, after writing .pkl the file with python 3 and returning to >>> python 2, my applications fail with the error reported in my first message. >>> The error goes away if I replace the .pkl file with an old backup I had >>> made before using python 2. >>> >>> I have noticed that once the .pkl file is written with python 3, then >>> reading it with python 2 and 3 throws different results: >>> >>> *with python 3*: >>> >>> r = pickle.load(open('domains_apps.pkl', 'rb')) >>> >>> print(r) >>> {'prod.com': 'prod', 'test.com': 'test'} >>> >>> >>> *with python 2*: >>> >>> r = pickle.load(open('domains_apps.pkl', 'rb')) >>> >>> print(r) >>> {*u*'prod.com': *u*'prod', *u*'test.com': *u*'test'} >>> >>> >>> Notice that in python 2 reading the .pkl file (that was written with >>> python 3 using protocol=2) returns unicode strings. This doesn't happen in >>> python 3. But i'm not sure what protocol to use. >>> >>> I'll do some more tests and I'll post here whatever solution I can find. >>> Thanks for your time! >>> Regards, >>> Lisandro. >>> >>> >>> >>> >>> >>> El jueves, 10 de octubre de 2019, 21:21:53 (UTC-3), Dave S escribió: >>>> >>>> Delete all the .pyc files? >>>> >>>> >>>> /dps >>>> >>> -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/web2py/d19b4989-f854-4a28-9617-59cc7c877417%40googlegroups.com.