On Sun, Sep 17, 2017 at 3:27 PM, Peter Otten <[email protected]> wrote:
> leam hall wrote:
>
> > Doesn't seem to work. The failing code takes the strings as is from the
> > database. it will occasionally fail when a name comes up that uses
> > a non-ascii character.
>
> Your problem in nuce: the Python 2 __str__() method must not return
> unicode.
>
> >>> class Character:
> ... def __str__(self): return u"Brösel"
> ...
> >>> print(Character())
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in
> position
> 2: ordinal not in range(128)
>
> While you may define a __unicode__ method it has to be called explicitly:
>
> >>> class Character:
> ... def __unicode__(self): return u"Brösel"
> ...
> >>> print(Character())
> <__main__.Character instance at 0x7fc10020f5a8>
> >>> print(unicode(Character()))
> Brösel
>
> Another alternative is to convert explicitly, to some encoding, and hope it
> works in the actual environment:
>
> >>> class Character:
> ... def __unicode__(self): return u"Brösel"
> ... def __str__(self): return unicode(self).encode("utf-8")
> ...
> >>> print(Character())
> Brösel
>
Ah! So this works in Py2:
def __str__(self):
name = self.name.encode("utf-8")
It completely fails in Py3:
PVT b'Lakeisha F\xc3\xa1bi\xc3\xa1n' 7966A4 [F] Age: 22
Note that moving __str__() to display() gets the same results. Not sure it
is an issue with __str__.
> The more you think about it the more attractive a switch to Python 3 will
> appear.
>
Not for me, actually. I'm trying to learn better OOP and coding in general.
I'm using Python because there's a work related use case for Py2. There
isn't one for Py3. If the work use case it removed then there are lots of
languages to try out.
--
https://mail.python.org/mailman/listinfo/python-list