Python

Python 项目目录结构与 pytest

最近在用 Python + Qt 做一个客户端项目,于是便重新梳理了一下项目目录结构,以及尝试用了下 pytest 写单元测试。 Python 项目的目录结构参考的是 stackoverflow 上的一位哥们的答案:how-are-python-projects-structured。   1 Python 项目目录结构 以下图为例: ① 项目(project)根目录叫做 TransferDog,项目的源码包(package)就叫做 transfer_dog。 […]

深入理解 Python 中的类与元类

最近在使用 peewee 来做数据库 ORM,期间遇到一些疑问便查了下源码,结果发现好多以前没有好好理解并整理的知识。 参考视频:https://www.bilibili.com/video/BV1uA411V7dW?p=1 关于 Python 中类的基本用法,参考以前写的文章 《python 小技巧与坑 – python 的类》 总结: 对象(obj)是类(class)的一个实例,而类(class)本身其实也是一个对象,它是元类(metaclass)的实例。 在 Python 中,默认情况下,所有类的元类都是 type,所有类的基类都是 object。

Qt: 自定义 QTreeView(2)- 显示自定义 widget 以及 GIF

本文所涉及代码:https://github.com/funway/TestQTreeView 一、自定义 Widget 由于我们的自定义 widget 是由几种内建 widget 组合而来,所以不需要在 paintEvent() 方法中进行手工绘制。parent widget 会自动调用 child widgets 的绘制方法 paintEvent()。 注意,在 QLabel 中加载要缩放的图片时,最好用 QLabel.setPixmap(

Qt: 自定义 QTreeView(1)

一、QTreeView 基本使用 下面的代码通过 QTreeView 实现一个任务列表的树形展示,任务列表包含两级结构:任务组与任务。 import logging, sys from PyQt6 import QtCore from PyQt6.QtWidgets import QApplication, QMainWindow, QTreeView from PyQt6.QtGui

python 正则匹配任意字符的一个坑

错误: .* 是匹配除了换行符\n以外的所有字符。 正确: 正确匹配任意字符的表达式应该是 [\s\S]* 或 [\d\D]* 或 [\w\W]*。(中括号 [] 表示字符集合,匹配集合中的任意字符。) 错误: 另一种错误表达式是 (.|\s)* 。这个乍一看是没有问题的,但在执行 findall() 匹配的时,可能会遇到无法终止的情况。举一个例子看看: #!/usr/bin/python2 #

postgresql的timestamp类型与python的datetime类型之间的坑

最近的项目突然发现一个bug,就是当服务器系统时区是utc时区,而服务器pgsql的时区是+8时区时候,通过python的datetime.now()插入的timestampz值有问题。所以特意做了一个测试。 1 测试前提 1.1 python的datetime类型 首先,要了解python的datetime类型是包括时间与时区的。而通过datetime.now()与datetime.utcnow()获得的时间其tzinfo属性为null,即不带时区属性。要想获得带时区属性的datetime类型,就必须使用datetime.now(tz=timezone.utc)或者datetime.now(tz=timezone(timedelta(hours=8)))。 1.2 pgsql的时间戳类型 然后,pgsql的时间戳类型包括timestamp(无时区), timestampz(有时区)两种。 1.3 测试表与测试代码 为了进行测试,我新建了一张time_test表,然后分别插入pythono的datetime.now(), datetime.utcnow(), datetime.now(timezone.utc)三个值。 #!/usr/bin/env python # -*- coding:

midi文件解析 by python mido

首先要记住,midi文件并不存储声音,只存储指示合成器(电子乐器)如何发声的动作,比如某个时刻以什么力度按下某个音符。 音符note 狭义的音符指C、D、E、F、G、A、B七个(即Do–Re–Mi–Fa–Sol–La–Si)。广义的应该是包括音符与对应的音阶,比如中央C即C4。音符、琴键与它们在midi中编号的关系如下图所示: 在midi信息中的note number从[21, 108]对应着钢琴的88个琴键。 midi channels 通道,最多有16个通道。可以了解为每个通道对应一个物理输出,所以midi最多可以同时控制16种乐器。 midi tracks 音轨,音轨与通道并不是一一对应,而是可以多对多的关系。音轨是逻辑上的划分,比如可以将钢琴的左手演奏放在track 1,右手演奏放在track 2。但是输出时候,都是对应输出到钢琴的通道。你也可以只设置一个track 1,并且在里面记录着不同通道的消息。另外,还经常将track 0用来存储midi的元信息。 event 事件,也叫做消息(在mido库中使用message表示)。包括三种事件meta event,midi event,

pip离线打包与安装python库

1、从本机导出第三方库列表 pip freeze > requirements.txt 2、根据列表从网络下载第三方库安装包 pip download -d packages -r requirements.txt 理论上pip download命令可以通过–no-index –find-links参数指定从离线环境下载安装包,但是我估计所谓的离线安装包并不等同于\Python36\Lib\site-packages这个目录,毕竟这个目录是安装完后的包目录。如果让–find-links指向这个目录的话,有可能成功也有可能失败,失败了pip也不给详细的错误输出。 所以不管怎么说,还是乖乖的从网上的pip仓库下载安装包吧。 3、将packages文件夹与requirements.txt文件拷贝到目标机器后,在目标机安装第三方库 pip install –no-index

pyinstaller打包py程序

1. 基本语法 pyinstaller命令行的语法是: pyinstaller [options] script [script …] | specfile 通常情况只需要将命令行移动到需要打包的脚本根目录下,然后运行: # 打包myscript.py脚本,生成一个包含可执行文件的目录 pyinstaller myscript.py # 打包myscript.py脚本,生成单个可执行文件,并且关闭终端输出 pyinstaller –onefile –windowed

pyqt5

这两个礼拜做一个报文发送的后台守护程序,用到了pyqt5做用户界面。 1.简单窗口 import sys from PyQt5.QtWidgets import QApplication, QMainWindow def main(): # 生成QApplication主程序 app = QApplication(sys.argv) # 生成窗口类实例 main_window =

Scroll to Top