如何判断类是类

2018年6月29日 07:29

在写动态加载时,通常需要过滤出需要的类。如何从模块中过滤出其中的类呢?

  • 判断a是类A的实例
isinstance(a, A)
  • 判断B类是A的子类
issubclass(B, A)
  • 判断A是一个类
isinstance(A, type) 
  • 判断B是类并且是A的子类
isinstance(B, type) and issubclass(B, A)
《寿康宝鉴》有声书
寿康宝鉴百话有声书(mp3)
 

评论(31) 阅读(2207)

TypeError: Unicode-objects must be encoded before hashing

2018年6月29日 07:16

python3中md5加密报错

>>> import hashlib
>>> md5 = hashlib.md5()
>>> md5.update("123")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing

正确方式

unicode对象不能直接加密

md5.update("123".encode("utf-8"))
 
《寿康宝鉴》有声书
寿康宝鉴百话有声书(mp3)

 

Tags: python3
评论(15) 阅读(17808)

pycharm回车符问题

2018年6月24日 07:31

pycharm如何防止windows回车符呢?
 
pycharm新建项目之后,默认不会对回车符有任何处理。键盘回车、粘贴都会产生windows回车符.
 
  • 解决办法
1.选中项目根节点
2.File-->Line Separators-->LF Unix
 
《寿康宝鉴》有声书
寿康宝鉴百话有声书(mp3)

 

Tags: pycharm
评论(2) 阅读(2057)

python中如何防止sql注入

2018年6月10日 08:37

python访问数据库的底层库很多,以pymysql为例, 它在执行sql前,会对sql中的特殊字符进行转义,如
 
  • 字符转义
def escape_string(value, mapping=None):
    """escape_string escapes *value* but not surround it with quotes.

    Value should be bytes or unicode.
    """
    if isinstance(value, unicode):
        return _escape_unicode(value)
    assert isinstance(value, (bytes, bytearray))
    value = value.replace('\\', '\\\\')
    value = value.replace('\0', '\\0')
    value = value.replace('\n', '\\n')
    value = value.replace('\r', '\\r')
    value = value.replace('\032', '\\Z')
    value = value.replace("'", "\\'")
    value = value.replace('"', '\\"')
    return value
 
  • 执行sql的正确方法,不要在sql中拼接参数,字符转义只会针对参数args
# query作为sql模板,args为将要传入的参数
execute(query, args=None)
 
  • django/sqlalchemy
orm框架都是使用pymysql/MySQL-python等库,并且都使用execute(query,args)调用,将sql与参数分开传入。
 
  • sql注入检测工具
sqlmap
 
《寿康宝鉴》有声书
寿康宝鉴百话有声书(mp3)
 

Tags: db
评论(0) 阅读(2127)

python3.6编码错误unable to load the file system codec

2018年6月02日 20:09

  • 情况描述
在windows中安装python、virtualenv后,启动cmd界面,使用virtualenv创建运行环境出现错误,意思是加载不了系统编码
 
c:\python36\Scripts\virtualenv.exe test
Fatal Python error: Py_Initialize: unable to load the file system codec
  • 解决办法
将cmd编码改为utf-8
chcp 65001
 

Tags: python3
评论(154) 阅读(18529)

zfill自动补0

2018年5月19日 17:14

python提供了zfill(zero fill)函数自动为字符串前面补0
>>> "5".zfill(2)  #2表示字符串宽度
'05'
 
《寿康宝鉴》有声书

 

评论(0) 阅读(1568)

python常见编码错误集合

2018年5月17日 11:08

  • 错误1:变量加载到内存出现编码错误
文件内容
a="中国"
print a

#报错
➜  ~ python a.py
  File "a.py", line 1
SyntaxError: Non-ASCII character '\xe4' in file b.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
编译会读取变量a存到内存,因为包含中文,转化为str(ascii默认编码)报错
磁盘字节串utf-8-->无法转为内存字节串str(ascii)
 
  • 错误2:str直接encode报错
>>> sys.getdefaultencoding()
'ascii'
>>> a="中国"
>>> a.encode("gbk")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>> b=u"中国"
>>> b.encode("gbk")
'\xd6\xd0\xb9\xfa'
变量a的类型是str(utf-8字节串),会自动调用decode(默认编码ascii),转为unicode,再调encode
按照默认编码去decode变量utf-8编码字节串会报错
 
 
  • 错误3:编码相互转换报错
>>> "中国".decode("utf-8").encode("ascii")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
>>> "中国".decode("utf-8").encode("gbk")
'\xd6\xd0\xb9\xfa'
>>> "a".decode("utf-8").encode("ascii")
'a'
 
ascii是utf-8的子集合,小集合转换大集合没有问题
大集合转为小集合就报错不支持
 
  • unicode不能再decode
>>> a = "中国"
>>> b = a.decode("utf-8")
>>> b
u'\u4e2d\u56fd'
>>> b.decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
 
  • 总结
理解编码错误时,首先要判断str时以什么编码存放在内存中的,然后判断是否符合转换公式(str-(decode)->unicode-(encode)->str)。
判断方法,在python2中用len(str)或者bytes(str)可以判断,中文utf-8占3个字节,gbk占2个字节,ascii占一个字节。
 
印光大师十念法(胡小林主讲第1集)
此生必看的科学实验-水知道答案

 

评论(0) 阅读(1744)

python2字符串在内存中如何存放

2018年5月14日 14:07

  • str类型
存在磁盘上的格式与存在内存中格式一致,例如ascii编码占一个字节,utf-8编码中文3个字节,英文1个字节
gbk编码中文2个字节,英文一个字节
 
注意python2是不会自动转换成unicode格式
 
  • unicode类型
python2用来支持多语言,不同编码类型的str转换需要通过它
unicode表示字符串属于逻辑层面,字节串(str)表示存放格式属于物理层面,如ascii,utf-8,gbk属于字节串
 
  • ascii在内存中字节数(utf-8/gbk同样1个字节)
>>> sys.getsizeof("a")       #pyton做了包装,包含了其它数据内容
38
>>> sys.getsizeof("aa") - sys.getsizeof("a")   # 将字符重复一个求差值,可知单个字符长度
1
 
  • unicode在内存中长度(python2中4个字节)
>>> sys.getsizeof(u"aa") - sys.getsizeof(u"a")   #python2中4个字节、python3中2个字节
4
>>> sys.getsizeof(u"你你") - sys.getsizeof(u"你")
4
 
  • utf-8长度(3个字节)
>>> a1,a2="a".encode("utf-8"),"aa".encode("utf-8")
>>> sys.getsizeof(a2) - sys.getsizeof(a1)  #英文一个字节
1

>>> b1,b2="你".decode("utf-8").encode("utf-8"),"你你".decode("utf-8").encode("utf-8")
>>> sys.getsizeof(b2) - sys.getsizeof(b1)   #中文三个字节
3
同样的方法可以知道gbk英文一个字节,中文2个字节
 
 
印光大师十念法(胡小林主讲第1集)

 

Tags: python
评论(2) 阅读(1902)

gbk英文字符占几个字节

2018年5月14日 12:24

  • gbk英文字符占几个字节
➜  ~ python3
>>> bytes("你", "gbk")
b'\xc4\xe3'
>>> bytes("a", "gbk")
b'a'
>>> bytes("你", "utf-8")
b'\xe4\xbd\xa0'
>>> bytes("a", "utf-8")
b'a'
gbk中文2个字节,英文1个字节;utf-8中文3个字节,英文1个字节
 
  • 字符占几个字节
英文字母:
字节数 : 1;编码:GB2312
字节数 : 1;编码:GBK
字节数 : 1;编码:GB18030
字节数 : 1;编码:ISO-8859-1(latin-1)
字节数 : 1;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE


中文汉字:
字节数 : 2;编码:GB2312
字节数 : 2;编码:GBK
字节数 : 2;编码:GB18030
字节数 : 1;编码:ISO-8859-1(latin-1)
字节数 : 3;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE
 
 
印光大师十念法(胡小林主讲第1集)

 

Tags: python
评论(1) 阅读(2612)

函数默认值初始化引起的问题

2018年3月30日 17:58

函数的默认值只会创建一次,之后不会再变了,使用对象(列表、字典、实例)作为默认值,会导致函数混乱
  • 官方说明
  • 示例
def f(a, L=[]):
    L.append(a)
    return L
for i in range(3):
    print f(i)
#输出
[0]
[0, 1]
[0, 1, 2]
  • 规避方法
def f(a, t=None):
    t = t or []
    t.append(a)
    return t
 
印光大师十念法(胡小林主讲第1集)

 

评论(6) 阅读(1261)