gpt4 book ai didi

Python:如何强制 "print"使用 __unicode__ 而不是 __str__,或者自然地使用 "print"消息而不显式调用 unicode()

转载 作者:太空狗 更新时间:2023-10-29 21:47:34 28 4
gpt4 key购买 nike

基本上我只想能够使用一个名为 Bottle 的类创建实例:例如 class Bottle(object):... 然后在另一个模块中能够简单地“打印”任何实例无需破解代码即可显式调用字符编码例程。

总而言之,当我尝试时:

obj=Bottle(u"味精")
print obj

或者“就地”“打印”:

print Bottle(u"味精")

我得到:

"UnicodeEncodeError: 'ascii' codec can't encode characters"

类似的stackoverflow问题:

¢ 目前转python3不可行。 ¢

非常感谢有关如何执行就地 utf-8 打印(就像下面的 U 类成功一样)的解决方案或提示(和解释)。 :-)

ThanXN

--

示例代码:

-------- 8>< - - - - 在这里剪切 - - - -

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def setdefaultencoding(encoding="utf-8"):
import sys, codecs

org_encoding = sys.getdefaultencoding()
if org_encoding == "ascii": # not good enough
print "encoding set to "+encoding
sys.stdout = codecs.getwriter(encoding)(sys.stdout)
sys.stderr = codecs.getwriter(encoding)(sys.stderr)

setdefaultencoding()

msg=u"味精" # the message!

class U(unicode): pass

m1=U(msg)

print "A)", m1 # works fine, even with unicode, but

class Bottle(object):
def __init__(self,msg): self.msg=msg
def __repr__(self):
print "debug: __repr__",self.msg
return '{{{'+self.msg+'}}}'
def __unicode__(self):
print "debug: __unicode__",self.msg
return '{{{'+self.msg+'}}}'
def __str__(self):
print "debug: __str__",self.msg
return '{{{'+self.msg+'}}}'
def decode(self,arg): print "debug: decode",self.msg
def encode(self,arg): print "debug: encode",self.msg
def translate(self,arg): print "debug: translate",self.msg

m2=Bottle(msg)

#print "B)", str(m2)
print "C) repr(x):", repr(m2)
print "D) unicode(x):", unicode(m2)
print "E)",m2 # gives: UnicodeEncodeError: 'ascii' codec can't encode characters

-------- 8>< - - - - 剪切这里 - - - -Python 2.4 输出:

encoding set to utf-8
A) 味精
C) repr(x): debug: __repr__ 味精
{{{\u5473\u7cbe}}}
D) unicode(x): debug: __unicode__ 味精
{{{味精}}}
E) debug: __str__ 味精
Traceback (most recent call last):
File "./uc.py", line 43, in ?
print "E)",m2 # gives: UnicodeEncodeError: 'ascii' codec can't encode characters
UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-4: ordinal not in range(128)

-------- 8>< - - - - 剪切这里 - - - -Python 2.6 输出:

encoding set to utf-8
A) 味精
C) repr(x): debug: __repr__ 味精
Traceback (most recent call last):
File "./uc.py", line 41, in <module>
print "C) repr(x):", repr(m2)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-4: ordinal not in range(128)

最佳答案

如果您使用 sys.stdout = codecs.getwriter(encoding)(sys.stdout) 那么您应该将 Unicode 字符串传递给 print:

>>> print u"%s" % Bottle(u"魯賓遜漂流記")
debug: __unicode__ 魯賓遜漂流記
{{{魯賓遜漂流記}}}

正如@bobince 在评论中指出的那样:避免以这种方式更改 sys.stdout 否则它可能会破坏任何与 sys.stdout 一起工作但不工作的库代码不要期望打印 Unicode 字符串。

一般来说:

__unicode__() 应该返回 Unicode 字符串:

def __init__(self, msg, encoding='utf-8'):
if not isinstance(msg, unicode):
msg = msg.decode(encoding)
self.msg = msg

def __unicode__(self):
return u"{{{%s}}}" % self.msg

__repr__() 应该返回 ascii 友好的 str 对象:

def __repr__(self):
return "Bottle(%r)" % self.msg

__str__() 应该返回 str 对象。添加可选 encoding 来记录使用的编码。这里没有选择编码的好方法:

def __str__(self, encoding="utf-8")
return self.__unicode__().encode(encoding)

定义write()方法:

def write(self, file, encoding=None):
encoding = encoding or getattr(file, 'encoding', None)
s = unicode(self)
if encoding is not None:
s = s.encode(encoding)
return file.write(s)

它应该涵盖文件有自己的编码或直接支持 Unicode 字符串的情况。

关于Python:如何强制 "print"使用 __unicode__ 而不是 __str__,或者自然地使用 "print"消息而不显式调用 unicode(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8222270/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com