************** python类库学习 ************** ====== 标准库 ====== argparse -------- argparse的作用感觉就是能把命令行中的参数传递进程序里面,并且这些指令和参数应该都是自己定义的,所有的参数感觉都是arparse自己定义的 `Argparse简易教程 `_ 原理:创建一个解析器类ArgumentParser,然后对其调用parse_args方法,默认会从sys.argv中获取命令行参数进行解析 1. argparse创建的parse会对参数进行跟踪,positional参数是必须有的,optional参数是可有可无的,-h是特殊的 .. image:: _static/0F1B1C41-78D0-4811-8639-FB84D93AC648.png 2. 当使用optional参数的时候需要为其进行赋值,不然会报错 3. 对于参数还可以设定一些action 4. 对于optional参数可以使用短命令来代替长命令 unittest -------- 1. 每一个测试都会运行setup和teardown re模块 ------ 1. 使用re.sub可以替换字符串当中的指定内容,这个用法十分强大 2. 使用re.match可以判断字符串是否与pattern相匹配,要注意这个是从字符串头部开始进行匹配的 collections ----------- 1. 使用defaultdict能够指定值类型,插入键的时候会定义默认空值,这样做list的append,或者int的加法,就不需要判断对应的key是否存在,不存在也会在空值的基础上做操作 os模块 ------ 1. 通过os.scandir函数可以返回一个entry文件对象列表,这些entry对象超级好用,用起来很爽 imghdr ------ 里面他妈就一个函数,说是要一个filename参数,其实这个参数就是一个pathlike的参数,如果直接用filename貌似就只能读取当前目录下的文件了(其实filename也是pathlike,只不过是一个相对路径的pathlike而已) threading --------- 1. python当中可以通过thread类构造一个线程对象,默认的线程对象是用户线程级别的,可以通过设置thread.daemond将其转变为守护进程,如果是守护进程的话就会在所有用户进程结束后自动关闭 2. 通过对线程调用join()方法可以阻塞后面线程的执行,仅当该线程执行完毕,主线程才会被执行 random ------ 1. choice是在序列中随机选一个字母 2. ``random.randint(a, b)`` 是a与b之间的(包含a和b)任意一个数字 tkinter ------- 1. 感觉上tkinter应该在监听事件的时候运用了协程的机制,现在在实际运用过程当中发现就算线程在一个函数当中执行,返回tkinter进行update的时候会自动进入到新的函数,等新的函数执行完了再反过头来执行现有的函数,这个感觉跟协程像极了(学了协程之后感觉不太可能是协程,找个时间看一下是怎么回事,以后写这种东西要有上下文啊) 2. 使用 ``state = ‘disable’`` 可以使组件处于不可用状态 3. 使用grid布局,如果位置相同后面的会覆盖前面的 4. 可以使用 ``label[‘text’]`` 这种方式来对组件的一些参数进行动态的修改,这是因为对象支持__getitem__方法 5. 可以通过设定父容器的columnconfigure和rowconfigure来限制大小 6. 对于调用grid方法之后的对象使用grid_remove可以取消grid,但是该对象仍然存在,如果要进行刷新我感觉直接del掉然后重新建一个应该就可以了(可以使用监控当前所使用对象的那个工作测试一下) 7. 如果要让一个frame控件固定大小,只有将其设置为grid_propagate(0)才能生效 8. 可以通过调用控件的grid_slaves(row=None, column=None)方法来获取其子控件的列表 hashlib ------- 1. 使用hashlib.md5()可以创建一个md5模式的hash对象 2. 使用hash.update()来接受需要被hash的参数,需要一个bytes对象 3. 使用hash.hexdigest()可以返回被处理产生的结果 4. 整个过程和isdangerous模块的使用挺像的 ======== 第三方库 ======== PIL --- 1. Image类,用到了几个函数,可以简单记一下 | (1)Image对象的open方法:用于载入一个图像文件,会return一个Image对象,参数就是一个pathlike参数 | (2)resize方法:用于重新设置图像的尺寸(像素),要记得第一个参数是一个元组,返回的是一个拷贝,并不会改变原Image对象 | (3)save方法:return None,直接save掉了,重名会覆盖哦(这个是废话) 2. ImageFont模块,主要用到的是 ``ImageFont.truetype(file, size)`` 3. ImageDraw模块 | (1)用到的是 ``drawObject.text(position, string, option)`` 用来在图片上写点字什么的`看这里 `_ | (2)draw的时候是每绘制一个像素就调用一次颜色值,所以颜色值是可以动态变化的 SQLAlchemy ---------- 1. 几个关注点: | (1)创建表时使用的数据类型需要进行引入 | (2)如果主键为int似乎默认就是自增的,如果强行为它添加值可能会遇到重复冲突,导致插入数据的时候报错 | (3)类名无所谓,是否创建新表的依据是类中的表名与数据库中的已存在的表名是否一致,如果不一致则会创建,如果一致后面的定义怎么改也不会对原表产生任何影响::还有一个点是尽量命名表名,不然好像会根据类名来改:: | (4)两种使用方式,第一种是裸SQL,另外一种是通过ORM的方式来进行使用 2. 具体使用: | (1)首先是创建一个数据库连接引擎 ``engine = create_engine('mysql+mysqldb://root:passwd@localhost:3306/database', echo=True)`` | (2)其次是使用 ``sessionmaker()`` 生成一个数据库会话类 ``DB_Session = sessionmaker(bind=engine)`` | (3)最后建立session ``session = DB_Session()`` | (4)可以直接通过 ``session.excute()`` 执行裸的sql命令 | (5)如果要使用ORM的模式,需要先创建一个BaseModel类,该类的子类可以自动与一个表进行关联 | (6)通过 ``BaseModel.metadata.create_all(engine)`` 可以找到BaseModel的所有子类,并在数据库中创建这些表 | (7)通过一些filter可以提取query的结果 | (8)通过非ORM的方式比较容易插入大批量的数据(直接循环不也可以么?) | (9)执行sql语句,记得最后要使用session.commit()来提交修改,然后使用session.close关闭连接,这是一个好习惯 | (10)session.commit()可以 **原子** 地写入更改 3. 非ORM使用方式当中的关键点就是使用param参数了 .. code-block:: python source result = session.execute( "SELECT * FROM user WHERE id=:param", {"param":5} ) 前面用:param表明是一个参数,后面则是一个dict,直接填充进去就可以了。下面是一个范例 ``session.execute('insert into learning_record values(:param0, :param)', {'param0': item[0], 'param': item[1]})`` 4. ORM方式的使用要点 | (1)可以通过relationship建立一个一对多关系,一般建立在“一”中,其中的backref参数就是反向的实例变量是什么,反向实例变量中包含的会是一个“一”的对象,而正向应该是多个“多”的对象,是先有外键建立潜在的关系,之后能依据潜在的关系建立relationship | (2)可以用过__repr__函数定义print这个对象的时候print出来的东西是什么 | (3)有点搞明白 ``base.metadata.create_all()`` 的作用机制了,首先base是一个根据declarative_base函数创建的类,这个类有一个属性叫做metadata,而这个属性是一个metadata类型,其包含了所有关于表结构的数据,并且有一个叫做create_all的方法,能够创建其中包含的所有表,那么它是如何获取子类中的表信息的呢?啊哈,有意思,他的metadata是和所有子类的metadata共享的,也就是创建一个子类就会更新metadata,这一点可以通过更新类的类变量来实现(还有一个问题,类的创建是什么阶段被解释的呢?其背后的原理究竟是什么呢?) 5. 如果两个外键是同一个字段,那么在对应的relationship当中需要指明外键 .. image:: _static/A2395197-2673-4056-8F66-8C87EE67BF12.png smtplib以及email学习 -------------------- 1. 要在非body当中包含中文内容,比如说标题、发送者、接收者,需要使用Header类来生成一个Header对象,然后通过encode()方法生成一个对应的字符串(还是byte串?) 2. MIMEText类是一个dictlike的类,其对象能够和dict一样通过key来取value requests -------- 1. 通过设定stream=True可以用stream模式进行请求,在该模式下不会立即下载请求体,只会下载请求头,只有调用response.content的时候才会对请求体进行瞎子啊 2. 对于stream模式下的请求,可以使用response.iter_content这个迭代器获取请求体,这个的好处是可以节省内存,通过设定chunk_size可以限定每次最大获得的请求数据(这个的还有一个好处是能够更加细粒度地控制,其实底层http信息传递本身就是字节流) Alfred Workflow --------------- 1. workflow的流程分为两个部分,第一个是通过alfred将关键字以query的形式传进脚本,之后都以前一个脚本的print作为后一个脚本的query,在最后的时候print一个xml/json,通过这个xml在alfred当中输出内容,执行输出内容的时候通过xml的arg字段传递信息给执行者 2. python的Alfred-Workflow库当中的add_item默认是valid是False,如果需要执行的话必须设置valid=True,这个坑让我折腾了挺久 3. Workflow.run(func)能够执行func并且将Workflow实例以参数的形式传进func中 4. send_feedback方法就是打印xml