Hard Python
文章平均质量分 82
utmhikari
talk is cheap code is rich
展开
-
【Hard Python】【第五章-字符串】2、re,正则表达式源码详解
正则表达式是文本处理中的重要部分,通过匹配特定的正则表达式,能够很方便地编写提取特定文本的代码。在python中,同样也已经拥有了正则表达式库re,为各位开发者提供了正则表达式的支持。在python官方文档中,已经对正则表达式模块接口、词法和用法做了详细的介绍:re——正则表达式操作正则表达式HOWTO正则表达式常见的用法如下:import redef test_pattern(): pat = re.compile('[0-9]{2,3}') print(pat.mat原创 2022-05-14 21:00:31 · 661 阅读 · 0 评论 -
【Hard Python】【第五章-字符串】1、unicode,py3的字符串实现
python的字符串实质到底是什么类型的数据,这个可是困扰着很多编程者的话题。在python2我们已经被中文编码相关的问题折磨的不轻,那到了python3之后为什么又解决了这个问题呢?今天这篇文章就带大家详细剖析python3的字符串实现。我们首先看一段代码:def test_str_basic(): s = '123456789' print(type(s))这段代码打印了一个字符串对象的类型,其结果为<class 'str'>。str类型从哪里来?从C源码中我们可以搜原创 2022-05-08 15:10:20 · 427 阅读 · 0 评论 -
【Hard Python】【第四章-日志】2、日志消费者Handler的实现
在上篇文章里说完了日志实例Logger和日志管理Manager,现在该提到Handler了。Handler是日志信息的消费者,单个Logger实例注册多个Handler,每生成一个LogRecord,就会被合法的Handler消费,在不同地方打印出日志信息。要研究Handler,首先需要看下基类的实现:class Handler(Filterer): def handle(self, record): rv = self.filter(record) if rv:原创 2022-04-16 10:54:22 · 342 阅读 · 0 评论 -
【Hard Python】【第四章-日志】1、Logger与Manager的源码实现
python语言内置了一个强大的日志模块logging,也是python内部最为复杂的功能模块之一,通过这个模块我们能够实现不同样式的日志打印。关于logging模块的官方文档也非常完备:logging的用法日志常用指引日志操作手册logging APIlogging日志记录工具logging configlogging handlers为此,本文起我们对python的logging模块进行深入剖析,从而让大家能够更好地掌握python的logging模块。基础配置我们原创 2022-04-09 14:35:05 · 1163 阅读 · 0 评论 -
【Hard Python】【第三章-GC】2、python的GC流程
除了通过引用计数直接销毁对象之外,python还是拥有内在GC机制的,并且也有完整的一套流程。如果只有通过引用计数销毁对象这种机制,那么随便构造一个循环引用就会造成内存泄漏,比如下面的代码:def _dump_gc(): gcobjs = gc.get_objects() pprint.pprint(len(gcobjs))def test_circle(): def _test_internal(): _dump_gc() a = []原创 2022-03-19 14:44:40 · 1095 阅读 · 0 评论 -
【Hard Python】【第三章-GC】1、引用计数与内存释放机制
对于编程语言runtime来说,建立起良好运转GC机制是非常必要的,像Java和Go,其GC机制都经历了复杂的演化,当然同时也为编程语言带来了更好的性能,这也是为什么这两门语言能成为主流服务端语言的原因之一。相对于Java和Go,python的GC机制是相对简约的,其中最基础的机制之一就是引用计数。当对象生成时引用计数为1;对象被其它对象引用时引用计数增加1;对象没有被引用,又退出作用域的话,引用计数归0;引用计数归0后,对象被销毁。我们可以通过一个例子对引用计数机制进行研究:def test_ref原创 2022-03-12 15:12:20 · 2007 阅读 · 0 评论 -
【Hard Python】【第二章-异步IO】3、async/await的源码实现
说完了asyncio事件循环是如何运行异步任务的,接下来back to basic,我们一起看看async和await两个原语具体代表了什么含义。首先是async,async通常用来修饰一个函数,表示这个函数会返回一个协程。比如说:async def _coro_maker(i): print(i + 1)def test_async(): c = _coro_maker(1) asyncio.run(c)对_coro_maker进行反编译,得到这样的结果:Disa原创 2022-02-26 19:18:16 · 835 阅读 · 0 评论 -
【Hard Python】【第二章-异步IO】2、异步任务在事件循环中的执行
接续第一话的内容,事件循环在创建之后,又是如何运行协程任务以及异步IO任务的?由asyncio.run的代码可知,loop.run_until_complete是运行协程的方法。其定义如下:# base_events.pyclass BaseEventLoop(events.AbstractEventLoop): def run_until_complete(self, future): self._check_closed() self._check_ru原创 2022-02-20 19:58:07 · 1667 阅读 · 1 评论 -
【Hard Python】【第二章-异步IO】1、asyncio事件循环的创建
python3中增加的重要特性之一即为asyncio,其提供了异步编程的原语支持,从而能够让python在事件驱动、协程协同等方面的编程场景大杀四方。事件循环EventLoop是异步编程中的核心概念之一。python的异步IO,就从事件循环的实现开始讲起。首先看一段示例代码:async def _test_run_main(): for i in range(3): await asyncio.sleep(1) print(f'[test_run] {i}')原创 2022-02-12 20:40:23 · 1166 阅读 · 0 评论 -
【Hard Python】【第一章-多进程】3、Pool,多任务并行进程池
前面讲了进程创建与进程通信的内容,接下来讲一下多进程编程最能发挥的地方。对于同时运行多个同质任务来讲,采用multiprocessing.Pool进程池去管理是最方便的。Pool的用法如下:from multiprocessing import Pool, processimport osimport pprintdef _test_func(a, b): result = a + b print(f'{os.getpid()}: {result}') return re原创 2022-01-30 16:55:35 · 1606 阅读 · 0 评论 -
【Hard Python】【第一章-多进程】2、Pipe和Queue,进程间通信
第一话详细讲解了Process新进程是如何被创建的,接下来就来讲一下进程之间有什么通信的方法。要在multiprocessing中实现进程间通信,最直接的方法是采用Pipe或者Queue。其用法如下:from multiprocessing import Process, Pipe, Queueimport timefrom mp_module import log, segdef _test_queue(q): while True: msg = q.get()原创 2022-01-22 19:09:18 · 739 阅读 · 0 评论 -
【Hard Python】【第一章-多进程】1、Process,新进程的诞生
在python中,如果要做多任务并行的编程,必须要掌握multiprocessing库的相关运用。在python的multiprocessing官方文档中,已然详细给出了multiprocessing库的相关用法。多进程编程其实还是有很多坑存在的,为了进一步探索python多进程的机制,提升对python多进程编程的理解,本篇文章会对多进程模块的实现进行一次详细的剖析。多进程编程的第一话,首先来聊聊一个新的python子进程是如何诞生的。首先我们需要了解这么一个事情,python创建的进程之间模块状态是原创 2022-01-16 18:43:52 · 879 阅读 · 0 评论 -
【Hard Python】前言&目录
Hard Python,深度分析python语言特性与功能模块原创 2022-01-08 14:23:02 · 601 阅读 · 1 评论