常见错误集锦

0 评论
/ /
1118 阅读
/
4795 字
16 2018-07

1、调用的接口返回了一个布尔类型的参数,结果接收的时候使用了两个参数

    result, success = app_svr.add_or_update_app_token(user.id, app_version, app_type, '', '', city)
TypeError: 'bool' object is not iterable

 2、Python字符串处理出现错误:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 0: ordinal not in range(128)  

在写Python过程中,需要实现对应的字符串替换,将gVal['newPostPatStr']的值:

但是在用中的${titleName}替换为一个帖子的真正的标题。

gVal['newPostPatStr'].replace("${titleName}", postDict['titleName']);

的时候,出现上述错误:

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 0: ordinal not in range(128)
【解决过程】

1.很久之前,在用python的时候,就出现过很多次的某str类型变量,去调用replace,结果不起作用。

此处则是直接错误,无法运行。

2..注意到错误提示中的“ordinal not in range(128)”,意思是,字符不在128范围内,即说明不是普通的ASCII字符,超出处理能力了。所以感觉是str类型的变量,无法处理超过ASCII之外的字符。所以想到去将对应原始字符转换为unicode:

gVal['newPostPatStr'] = unicode(gVal['newPostPatStr']);


然后再去调用上面的replace,结果此句执行结果,也出现和上面同样的错误,无法转换为unicode。

3.尝试了去用re.compile,然后xxx.sub的形式,也是同样错误,无法替换字符串。

4.后来尝试了:

compiled = re.compile(r"${titleName}");
replacedStr = compiled.sub(postDict['titleName'], gVal['newPostPatStr']);

以及

compiled = re.compile(r"\$\{titleName\}");
replacedStr = compiled.sub(postDict['titleName'], gVal['newPostPatStr']);


都还是出现同样错误。

5.最后是通过,在最开始的时候,得到gVal['newPostPatStr']的值之后,

调用unicode时候指定对应的编码:

gVal['newPostPatStr'] = unicode(gVal['newPostPatStr'], "utf-8");


然后就可以强制转换为unicode了,然后之后的字符串处理,就都是可以正常的了。

6、使用supervisorctl启动项目,项目状态一直处于starting状态

查看项目的supervisor的启动错误日志,或者使用项目的supervisor配置中commond命令直接在虚拟环境下运行,就可以查看到错误 

【总结】

此处是最开始获得某字符串变量,没有通过指定编码为utf-8转换为unicode,然后接下来的操作,比如replace替换,就都无法处理包含了utf-8的,超出了128 range的字符,才会报UnicodeDecodeError错的。

所以,以后遇到UnicodeDecodeError方面的错误,那就先去看看,是不是由于没有指定合适的编码。如果指定了对应的编码后,字符串的一切操作(replace, re.sub等),一般来说,就都可以正常操作了。

不过,总的来说,还是要对字符编码很熟悉的,否则,Python中的字符编码方面的问题,真的会让人很头大,虽然python本身对字符编码做的已经不错了。。。

2. 

import sys
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
    reload(sys)
    sys.setdefaultencoding(default_encoding)

  三、两个数相除,结果报错

 

TypeError: unsupported operand type(s) for /: 'unicode' and 'int'

 

结果是两种类型不匹配,一种是unicode(前端传递过来),一种是整数型,所以报错,处理方式

int(str(str_text).encode("utf-8"))