Python 随笔两则

1. Python 2 None 对象无 __eq__ 方法的原因分析

Python2.7: typeobject.c 里面 PyBaseObject_Type 结构体 tp_richcompare 成员为 0
而在 Python 3.x 的代码里面这个成员的值是 object_richcompare
  
当 attr 的查找进入 __getattr__ 中,Python 按 __mro__ 来依次寻找,None 的 __mro__ 是
(NoneType, object),在 C 实现中,前者是 PyNone_Type,后者是 PyBaseObject_Type 。这两个类的
__dict__ 中都没有 __eq__ 这个 key,所以查找失败,raise AttributeError.
  
但是 object.__eq__ 却又能成功,那是因为 object 的类型是 type ,type.__dict__ 中就有 __eq__ 这个 key。有点绕。但通过这件事可以知道 NoneType 是一种“特殊”的类型。

2. Python 2 终端、文件编码问题

在交互式命令模式(Interactive shell)下:

>>> import sys
>>> sys.stdout.encoding 

在 Windows 下,如果你的系统是简体中文,一般输出会是 cp936

>>> import codecs
>>> codecs.lookup(‘cp936‘).name
‘gbk‘ 

这就是在 Windows 终端里面使用的编码。在 print 的时候,无论字符串源采取什么样的编码,最终输出的字符串的编码必须跟 shell 的编码一致,也就是说:

>>> print some_string 

Python 会做这样一个动作:

codecs.encode(some_string, coding, errors=‘strict‘) 

当 some_string 是一个 unicode 字符串,coding 是 gbk, some_string 里面包含 gbk 字符集里面没有的字符,Python 就会抛出一个 UnicodeEncodeError.
  
对于输出到文件中情况是类似的,Python2 的 open() 函数不会传入 encoding,以 ‘w‘ 方式打开文件,如果写入
unicode 字符串,Python 会获取当前默认的编码,然后以此种编码把字符串写入文件。可惜的是,“默认编码”只是 Python
自己默认的,在 Objects/unicodeobject.c 中,用一个全局变量 unicode_default_encoding
来表示默认的编码:

/* Default encoding to use and assume when NULL is passed as encoding
    parameter; it is initialized by _PyUnicode_Init().

    Always use the PyUnicode_SetDefaultEncoding() and
    PyUnicode_GetDefaultEncoding() APIs to access this global.

*/
static char unicode_default_encoding[100 + 1] = "ascii"; 

这个值在 Python 中有C接口(PyUnicode_SetDefaultEncoding)去改变, Python 层的接口:

>>> sys.setdefaultencoding(coding)

但需要在编译时增加 Py_USING_UNICODE 宏的定义,官方发布的 Windows 版本没有这个功能。

所以在调用到类似 file.write(some_string) 的时候,首先会有这样的编码过程:

codecs.encode(some_string, coding, errors=‘strict‘) 

当 some_string 是一个 unicode 字符串,并且包含 ascii 字符集不存在的字符时,就会抛出一个 UnicodeEncodeError。
  
所以,为了解决这个问题,可以这么处理:
(1) 在 Windows shell 下面:

>>> print some_string.encode(‘gbk‘, errors=‘ignore‘) # replace 也可,只要不是 strict 

(2) 在写入文件时,两种方法:
    a. 忽略不存在的字符,同(1)

>>> f = open(filename, ‘w‘)
>>> f.write(some_string.encode(‘gbk‘, errors=‘ignore‘)

b. byte 方式写入:

>>> f = open(filename, ‘wb‘)
>>> f.write(some_string.encode(‘utf-8‘))

a 会损失字符,b 不会。

时间: 2024-11-07 00:25:30

Python 随笔两则的相关文章

微信开发python+django两个月的成功经历,django是个好框架!

时间:大三 上学期没有用微信内置浏览器而纯对话开发,坑了自己好一下. 下学期选错bottle框架,以为轻量好,谁知开发中什么都自己来很痛苦. 选对了框架django,终于在大三最后的个把月里写出了里程碑式的现在这个微信端,自己都感动到,作为我大三一年web开发的终结吧. 亮点1:自带后台管理 亮点2:后台权限管理 亮点3:微信回复规则设置去代码化,图形界面. 亮点4:一平台多网店 技巧:微信规则不匹配时不能回复吗?不是,规则包含空字符总能匹配任意文本,请看下面的微信规则截图. 后台 选择botl

Python获取两个ip之间的所有ip

int_ip = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)]) ip_int = lambda x:sum([256**j*int(i) for j,i in enumerate(x.split('.')[::-1])]) def get_ips(ip1,ip2): f=open('ips.txt','w') ip1_num = ip_int(ip1) ip2_num = ip_int(ip2) for i i

python获取两个dict的不同

参数: dict1, dict2 需求:如果dict1和dict2中有不同的key,那么返回这个(key, dict1[key]):如果dict1和dict2中有相同的key,但是value不同,返回这个(key, dict1[key]) 实现: def dict_different_data(first, second): """ get the different data bewtten two dicts objects return :result = first

Python 求两个文本文件以行为单位的交集 并集 差集

Python 求两个文本文件以行为单位的交集 并集 差集,来代码: s1 = set(open('a.txt','r').readlines()) s2 = set(open('b.txt','r').readlines()) print 'ins: %s'%(s1.intersection(s2)) print 'uni: %s'%(s1.union(s2)) print 'dif: %s'%(s1.difference(s2).union(s2.difference(s1))) 原文地址:h

python将两个数组合并成一个数组的两种方法的代码

内容过程中,把写内容过程中常用的内容收藏起来,下面的资料是关于python将两个数组合并成一个数组的两种方法的内容,希望能对小伙伴们有帮助. c1 = ["Red","Green","Blue"]c2 = ["Orange","Yellow","Indigo"]c1.extend(c2) assert c1 == ["Red","Green",&q

初学python随笔

首先说编程语言分为编译型.解释型和混合型,其中python是属于解释型语言,下表为常见语言分类 编译型vs解释型 编译型优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高.可以脱离语言环境独立运行.缺点:编译之后如果需要修改就需要整个模块重新编译.编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件. 解释型优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安

Python的两种运行方式

从2015年5月19日注册博客园,立志于要通过写博客的方式,记录自己编程的点点滴滴,由于自己太懒,一直拖到现在,“拖延症”是病得改,今天终于写自己第一篇博客了,有点小激动! Python是由Guido van Rossum于1989年底发明的,1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承.之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者.国外人就是任性,

Python 产生两个方法将不被所述多个随机数的特定范围内反复

在最近的实验中进行.通过随机切割一定比例所需要的数据这两个部分.事实上这个问题的核心是生成随机数的问题将不再重复.递归方法,首先想到的,然后我们发现Python中竟然已经提供了此方法的函数,能够直接使用.详细代码例如以下: #生成某区间内不反复的N个随机数的方法 import random; #1.利用递归生成 resultList=[];#用于存放结果的List A=1; #最小随机数 B=10 #最大随机数 COUNT=10 #生成随机数的递归数学,參数counter表示当前准备要生成的第几

Python编写两个数的加减法游戏

目标: 1.实现两个数的加减法 2.回答者3次输错计算结果后,输出正确结果,并询问回答者是否继续 1.使用常规函数实现两个数的加减法游戏 代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- '''使用常规函数编写出题游戏''' import random def add(x,y): return x + y def sub(x,y): return x - y def chuti(): cmds = {'+': add, '-': sub} o