Python Language Server 支持Pydantic

步骤 打开pydantic/main.py文件并且搜索ModelMetaclass定义,在ModelMetaclass类型定义,粘贴以下代码: 1 2 3 4 5 6 7 8 def __dataclass_transform__( *, eq_default: bool = True, order_default: bool = False, kw_only_default: bool = False, field_descriptors: Tuple[Union[type, Callable[..., Any]], ...] = (()), ) -> Callable[[_T], _T]: return lambda a: a 增加包装器在ModelMetaclass定义上: 1 @__dataclass_transform__(kw_only_default=True, field_descriptors=(Field, FieldInfo)) 结果 修改前 修改后 参考文献 ……

阅读全文

Python3在类的内部使用当前类作为类型提示

问题 在Python3中,例如:构建链表节点类,会有一个指向自身类型的指针,代码如下: 1 2 3 4 5 class ListNode(object): value: int nextNode: ListNode def merge(self, head: ListNode): pass 如果直接写成这样,代码提示器是无法识别到的 解决 Python 3.10以及以后的版本 已经支持该方式 Python 3.7+ 使用feature 1 from __future__ import annotations Python 3.6以及更旧的版本 直接使用字符串的方式,例如: 1 2 3 4 5 class ListNode(object): value: int nextNode: 'ListNode' def merge(self, head: 'ListNode'): pass 参考资料 https://stackoverflow.com/questions/33533148/how-do-i-type-hint-a-method-with-the-type-of-the-enclosing-class……

阅读全文

Golang源码阅读 Bufio阅读

基本实现 实现带缓存的I/O模块 对io.Reader和io.Writer进行封装 实现带缓存 对字符的I/O操作友好 Reader(缓存输入) 实现了一个带缓存的io.Reader 数据结构 1 2 3 4 5 6 7 8 type Reader struct { buf []byte // 缓存 rd io.Reader // 被包装的io.Reader对象 r, w int // buf切片上的索引,r代表读取的索引,w代表写入的索引 err error // 用来存储该Reader在执行中遇到的error lastByte int // 已读取的最后一个字节; -1 代表无效 lastRuneSize int // 已读取的最后一个rune; -1 代表无效 } 默认信息 1 2 const minReadBufferSize = 16 // buf最小长度为16字节 const maxConsecutiveEmptyReads = 100 // 一次读取,在连续100次没读取到会认为失败 关键代码逻辑 func (b *Reader) fill() 读取新的一个数据块,尽可能读满buf;只会读取成功读取一次,允许maxConsecutiveEmptyReads次读取失败,但是第一次读取成功后就不再读取,返回;……

阅读全文

当golang遇见工厂模式

工厂模式 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 介绍 意图 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 主要解决 接口选择的问题。 何时使用 我们明确地计划不同条件下创建不同实例时。 如何解决 让其子类实现工厂接口,返回的也是一个抽象的产品。 关键代码 创建过程在其子类执行。 应用实例 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 Hibernate 换数据库只需换方言和驱动就可以。 优点 一个调用者想创建一个对象,只要知道其名称就可以了。 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 屏蔽产品的具体实现,调用者只关心产品的接口。 缺点 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。 使用场景 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。 注意事项 作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。 实现 现在有几个小孩:小明、小红、小白,现在要实现他们分别介绍自己的程序。我们将创建一个Child接口和实现Child接口的类。下一步是定义工厂类ChildFactory。 定义Child接口 1 2 3 type Child interface { IntroduceYourself() } 定义小明、小红、小白三个Child实现类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 type Min struct { } func (Min) IntroduceYourself() { fmt.……

阅读全文

如何使用vscode远程调试Python

插件 SFTP Python 配置 sftp.json 用于同步本地代码和远端服务器代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 { "name": "remote sync", "host": "remote host", "protocol": "sftp", "port": 22, "username": "username", "password": "password", "remotePath": "remote project path", "uploadOnSave": true, "ignore": [ ".vscode", ".git", ".DS_Store", ".idea", "venv", "__pycache__" ] } tasks.json 用于一键启动远端程序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 { // See https://go.……

阅读全文

Python判断数字字符串

今天遇到线上一个BUG,用户导入数据时,将某个字段填写一个负数会导致服务器报错,大概的代码如下: 1 2 3 4 if isinstance(obj, str) and obj.isdigit(): obj = int(obj) else: raise Exception("fuck you") 但是,负数并不能直接使用isdigit判断,看下截图: 所以,还需要做一些转换,满足这个需求: 1 2 3 4 5 6 7 8 9 10 def isdigit(num: str) -> bool: if not num: return False if num[0] == '-': return num[1:].isdigit() return num.isdigit() if isinstance(num, str) and isdigit(num): num = int(num) else: raise Exception("fuck you") ……

阅读全文

Ubuntu16.04 笔记本合上盖子时不进入休眠

在笔记本上装ubuntu系统,也可以从事相关开发工作。但笔记本存在这样的情况,就是有时服务功能设好了,不需要操作了,但是希望机器一直开机提供服务,或者长期下载大文件。此时,为了省电,可将笔记本屏幕合上,静待其完成任务。 但是,在默认情况下,笔记本合上屏幕后,ubuntu系统会休眠,我试着用GUI改了一下设置,实践证明没有效果,还是直接修改配置文件来得快,方法如下: 修改 Login Manager的配置文件,/etc/systemd/logind.conf: 然后将其中的: 1 #HandleLidSwitch=suspend 改成: 1 HandleLidSwitch=ignore 然后重启服务: 1 service systemd-logind restart 或者直接重启 1 sudo shutdown -r now 即可使设置生效。……

阅读全文

go-redis批量(pipeline)拉取数据的操作

主要没看见啥好的文档讲解,自己翻了翻源码,记录一下用法,见笑了 原理 在调用pipeline每次append命令时,会返回一个对应的xxxxCmd对象指针,保留这个指针即可,在Exec()函数执行完成后,会将结果写入对应的对象内 demo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 package main import ( "context" "fmt" "github.……

阅读全文

Python远程操作SSH

三方组件 paramiko 创建ssh 连接 1 2 3 4 5 6 7 8 9 10 11 12 13 def connect_ssh(host: str, port: int, username: str, password: str): ssh = paramiko.SSHClient() key = paramiko.AutoAddPolicy() ssh.set_missing_host_key_policy(key) ssh.connect(host, port, username, password, timeout=5) return ssh 执行命令 1 2 3 4 5 6 7 8 9 def execute(ssh: paramiko.SSHClient): stdin, stdout, stderr = ssh.exec_command('command') for line in stdout.readlines(): print(line) ……

阅读全文

幂次定律在Redis中的应用

幂次定律 如果某件事的发生频率和它的某个属性成幂关系,那么这个频率就可以称之为符合幂次定律。幂次定律的表现是少数几个事件的发生频率占了整个发生频率的大部分, 而其余的大多数事件只占整个发生频率的一个小部分。幂次定律 Redis中的应用 在Redis中的跳表内容中有一个zslRandomLevel函数,返回一个随机的层级 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /* Returns a random level for the new skiplist node we are going to create. * The return value of this function is between 1 and ZSKIPLIST_MAXLEVEL * (both inclusive), with a powerlaw-alike distribution where higher * levels are less likely to be returned.……

阅读全文