自己实现 abc 模块的核心功能
简介
写完这篇文章之后我又做了个视频和大家聊聊,说的应该更详细:https://www.bilibili.com/video/BV14Y4y1o7mN/
通过 abc 这个模块,我们可以在 Python 中使用抽象类,定义抽象方法、抽象属性。其本质是利用元类来检查是否有未实现的抽象方法,从而阻止抽象类的实例化,也就达到了目的。
所以说它只是一个辅助的检查手段,就像 Java 里的 @Overr ...
Python 实现动态的工厂模式
本文讨论的主要是,如何把工厂模式生产的产品,即抽象类的子类信息动态地保存到一个表中,而不是直接简单粗暴地使用 if-else 来判断。可能是 Java 给我的影响比较大,我还比较喜欢用抽象类抽象方法这些东西,至于好坏应该由实际情况来决定,这里就不详细展开讨论了。
那么本文所使用的示例来自于我一个分析 QQ 聊天记录文件的项目,因为它对于群聊的聊天记录和私聊的聊天记录格式不同,需要分别处理,所以就到 ...
Python itertools 简单介绍和运用例
最近写 Python 比较多,不可避免地要处理一堆可迭代对象,发现 Python 对于迭代器/生成器的支持相较于其它语言来说是更为丰富的,所以简单记录一下 itertools 这个内置包中几个常见的函数。
文末附一个实例,是一个关于扫雷的算法,用到了文中提到的一些函数。注意,我知道它们并不是真正的函数,而是以类的形式定义。为了方便起见,本文就把它们当成函数看代。
介绍
使用迭代器/生成器的好处是节 ...
使用 FastAPI+aiosqlite+databases 搭建服务端的基础用法
说明
本文是主要为从未使用过这些框架的人做一个介绍,并没有太多的技术含量。
连接池
首先先把我最焦虑的问题放在这里,到底要不要一个连接池?
我在 aiosqlite 的仓库中搜到了这样一条 issue,作者为我们介绍了为什么使用 sqlite 数据库时连接池不是那么重要。我并没有说它不重要,只是在轻量级使用中可以不在意这点。我这里把原文复制过来,并且把重要句子标粗。
Generally spea ...
拓展 marked 支持自定义表情
原理
为了方便,我只是拓展 renderer 里对于图片渲染的逻辑,处理我们自定义表情,官方文档地址:https://marked.js.org/using_pro#renderer
我们要把类似这样的图片:![@](12),也就是方框里填 @ 就认为它是我们的自定义表情,然后以后面的 href 为表情 id。
实现
1234567891011121314151617181920212223242 ...
异步加载 Vue 组件以减小 chunk 体积
问题
当你的组件过于复杂时,这里指它引用了非常多的第三方库,那么当你打包的时候或许会碰到下面的警告:
1234(!) Some chunks are larger than 500 KiB after minification. Consider:- Using dynamic import() to code-split the application- Use build.rollupOpti ...
Naive UI 使用独立 API 后警告 inject
解决方法
抽离出来一个单独的文件,用来储存 pinia 对象,如下:
123import { createPinia } from 'pinia'export const pinia = createPinia()
注意 main.ts 中的 app.use 也要用这个单独的文件暴露的 pinia 变量(也就是跨文件全局变量),之后再在调用 createDi ...
Python 使用 pkgutil 访问包内资源
结论
pkgutil 是 python 的内置模块,可以用来打开包内文件。
使用的时候如下:
123456import pkgutildef foo(): data: bytes = pkgutil.get_data(__name__, 'file.txt') content: str = data.decode('utf-8') prin ...
Python + inspect 一行实现递归 fib 函数
背景
有个裙友要看看用 lambda 能不能在一行里定义出来 fib 函数,并且不要那个根号五的数学公式,于是就有了这篇文章。
介绍
inspect 库可以帮助我们拿到 Python 上下文的各种信息,自然也包括了当前正在运行的函数。配合 eval 可以达到我们的目的。
实现
原始方法
虽然大家都知道,但还是放上来做一个对比。
1234567def fib(n): if n in (1, 2 ...
Vue Router 搭配 NaiveUI 的进度条
介绍
由于 naive ui 的进度条需要依赖于一个 NLoadingBarProvider,所以我们在定义 router 的时候是无法使用 useLoadingBar() 获取到进度条对象的。
我的解决方法是利用 pinia 把 loadingBar 示例获取到,然后存起来,这样就可以访问到了。
这里用 pinia 的原因单纯是因为它简单好用,并且还能在浏览器插件里看到变量的值,而单纯的全局变量 ...