Pickle模块

说明:Python中的pickle模块实现了基本的数据序列与反序列化,序列化对象可以在磁盘上保存对象,并在需要的时候读取出来。任何对象都可以执行序列化操作。

dump()方法

pickle.dump(obj, file, [,protocol])

参数定义
obj:序列化对象,将对象obj保存到文件file中去
file:file表示保存到的类文件对象,file必须有write()接口,file可以是一个以‘w’打开的文件,或者是一个StringIO对象,也可以是任何可以实现write()接口的对象
protocol:序列化模式,默认是0(ASCII协议,表示以文本的形式进行序列化),protocol的值还可以是1和2(1表示以老式的二进制协议,2表示新二进制协议)

import pickle

fw = open("pickleFileName.txt", 'wb')
pickle.dump("try", fw)

load()方法

pickle.load(file)

注释:反序列化对象,将文件中的数据解析为一个python对象。file中有read()接口和readline()接口

import pickle

fr = open("pickleFileName.txt", "rb")
result = pickle.load(fr)
print(result)

Python调试器pdb

pdb的两种用法

  1. 非侵入式方法
    无需修改源码,在命令行中可以直接进行调试
python3 -m pdb filename.py
  1. 侵入式方法
    需要在被调试的代码中添加一行代码
import pdb
pdb.set_trace()

单步执行模式

  1. 查看源代码
    命令:
l

说明:
查看当前位置前后11行源代码(多次会翻页)
当前位置在代码中会用–>符号标出
命令:

ll

说明:
查看当前函数或框架的所有源代码

  1. 添加断点
    命令:
b
b linenum
b filename:linenum
b functionname

linenum:表示断点添加到哪一行
filename:文件名,断点添加到哪个文件
functionname:函数名,在该函数执行的第一行设置断点
b:不带参数表示查看断点位置

  1. 添加临时断点
    命令:
tbreak
tbreak linenum
tbreak filename:linenum
tbreak functionname

说明:
执行一次后自动删除

  1. 清除断点
    命令:
cl
cl filename:linenum
cl bpnumber 

参数:
bpnumber 断点序号(多个以空格分隔)
说明:
不带参数用于清除所有断点(包括临时断点)
带参数则清除指定文件行或当前文件指定序号的断点

  1. 打印变量值
    命令:
p expression

参数:
expression Python表达式

  1. 逐行调试命令

命令1

s #执行下一行(能够进入函数体)

命令2

n # 执行下一行(不会进入函数体)

命令3:

r # 执行当前运行函数到结束
  1. 非逐行调试命令

命令1

c # 持续执行下去,制导遇到一个断点

命令2

unt linenum # 持续执行直到运行到指定行

命令3

j linenum # 直接跳转到指定行(注意,被跳过的代码不执行)
  1. 查看函数参数

命令:

a # 在函数中打印函数的参数和参数的值
  1. 打印变量类型

命令:
whatis expression
说明:
打印表达式的类型,常用来打印变量值

  1. 启动交互式解释器
interact # 启动一个python的交互式解释器,使用当前代码的全局命名空间
  1. 打印堆栈信息
w #打印堆栈信息,最新的帧在最底部,箭头表示当前帧

单刀直入

如果不想从程序开头执行pdb,那么可以在程序中import pdb之后,直接在代码里需要调试的地方放一个pdb.set_trace(),就可以设置一个断点,程序会在pdb.set_trace()暂停并进入pdb调试环境,可以用pdb变量名查看变量,或者c继续运行

argparse

定义: argparse是python标准库里面用来处理命令行参数的库

import argparse #首先导入模块

parser = argparse.ArgumentParser() 创建一个解析对象

parser.add_argument() 向该对象中添加你要关注的命令行参数和选项

args = parser.parse_args() #进行解析

type

假设我们写一个文件,在命令行将其编译时,同时输入一个数字,返回一个平方:
因为parse.add_argument()对于接受的值默认其为str,如果将之视为int类型,额外加一句“type=int”

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("square", help="To sqaure the number given", type = int)

args = parser.parse_args()
print(args.square**2)

可选参数

在add_argument前,给属性名之前加上‘–’,就能将之变为可选参数:

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("--bool", help="Whether to print sth.")
# 这里的bool是一个可选参数
args = parser.parse_args()

if args.bool:
	print('bool = 1')

对于可选参数,如果不指定的话,对应的变量就会被设置为None

对于简单程序,可能只需要两种值True或False
我们在原有程序的基础上,在add_argument中多加一个参数:action = “store_true”
这个时候,只要在命令行中加个bool, args.bool就是True,无需再加上之后的赋值内容

参数简写

parser.add_argument("-b", "--bool", action="store_true")

这样,在程序内部我们依旧使用args.bool,但是命令行张宝红只需要多写一个“-b”就行

混合定位参数和可选参数

当我们使用多个parser.add_argument(…)的时候,若将之视为可选参数,无则为None

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("-b","--bool",help="to show the ans in a sentencen form",action = "store_true")
parser.add_argument("square",type=int)

args = parser.parse_args() 

ans = args.square**2

if args.bool:
    print("the square of {} = {}".format(args.square,ans))
else:
    print(ans)
# 得到的效果为:一旦输入“-b”然后再输入相关的参数,就可以得到我们需要的结果了,不输入“-b”我们还是可以得到结果,只不过是另外一种方式而已。

进一步,我们可以进行以下操作:

  1. 限制输入的值:
    parser.add_argument("-b","--bool",choices=['0','1'],help="you can only input 0 or 1."其中,choice可以限定我们能够输入的数
  2. 参数值和顺序
    一般我们要把可选参数最后add,不可选参数放前面add.而在命令行里面输入代码时,程序会先赋值“先add的参数选项”
    比如我先parser.add_argument(“a”, …) 再b
  3. count操作计数赋值:
parser.add_argument("-b","--bool",action="count",type=int)

这时,在命令行中-b表示bool=1-bb表示bool=2

默认值default

parser.add_argument("-b","--bool",action="count",type=int,default=0)

可以设定参数的默认值