python small tips

Posted on 2016-04-19 20:20 in Python

最近的工作中遇到一些问题,记录了下来,希望后来的人不要再踩坑了。

all()

all()是python的一个内置函数,官方文档里面说如果所有的元素都为True,all()才返回True。:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

有一些情况需要注意,当list为空时,返回True;空字符串,None,0 的结果都是False。:

>>> all([])
True
>>> all(['a', 'b', 'c'])
True
>>> all(['a', 'b', ''])
False
>>> all(['a', 'b', None])
False
>>> all(['a', 'b', 0])
False

注册表中有中文的问题

在windows上安装python package,有时候会碰到: UnicodeDecodeError错误:

mimetypes.init() # try to read system mime.types
File "C:\Python27\lib\mimetypes.py", line 358, in init
db.read_windows_registry()
File "C:\Python27\lib\mimetypes.py", line 258, in read_windows_registry
for subkeyname in enum_types(hkcr):
File "C:\Python27\lib\mimetypes.py", line 249, in enum_types
ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0x88 in position 1: ordinal not in range(128)

这是因为python从注册表中HKEY_CLASSES_ROOT读取mimetype时,有包含中文的文件名后缀,一般都是阿里旺旺的。:

HKEY_CLASSES_ROOT\.阿里旺旺接收的可疑文件

删除这项就不会再出现UnicodeDecodeError错误。

我的版本是Python 2.7.6,会出现这个问题,Python 2.7.7及以后的版本修复了这个问题。

python setup.py develop

develop模式并不会真正的install这个包,而是在site-packages文件夹中建立一个.egg-link文件,类似于操作系统的软链接。 这样你就可以随意编辑你的代码,并不需要每次测试的时候都reinstall一遍。当然你的程序要以python包的形似来组织才行。

更多信息考参考文档 http://pythonhosted.org//setuptools/setuptools.html#development-mode

json 格式中单引号是不合法的

在json格式中单引号是不合法的字符,可以用replace(''', '"')替换掉。:

>>> json.loads("['a', 'b', 'c']")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "D:\Python27\lib\json\decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "D:\Python27\lib\json\decoder.py", line 383, in raw_decode
    raise ValueError("No JSON object could be decoded")
 ValueError: No JSON object could be decoded

redis.Redis 和 redis.StrictRedis zadd的参数顺序不一样的

redis.Redis.zadd(name, args,*kwargs) value在前,分数在后

args, 如: name1, score1, name2, score2, ... 或者是*kwargs, 如: name1=score1, name2=score2

redis.StrictRedis.zadd(name, args,*kwargs) 分数在前,value在后

args, 如: score1, name1, score2, name2, ... 或者是*kwargs, 如: name1=score1, name2=score2,