Python有哪些黑魔法

Python08

Python有哪些黑魔法,第1张

说到python黑魔法,必然要提到python的第三方协程库gevent的底层实现——greenlet。

greenlet直接在内存层面,通过保存和替换Python进程的运行栈来实现不同协程的切换。

这个切换对于python解释器是透明的,如果python解释器对环境有感知的话,则每当协程切换的时候,它的感觉可能类似一个人前一秒还在在路上走路,下一秒突然自己又出现在了地铁上。

对于普通python用户而言,直接操作python的运行时栈,这就是在刀尖上跳舞有木有,这要求对内存的操作100%精确,任何错误都可能导致python进程崩溃!

作者又是如何又是如何来保证正确性呢?除了要熟悉python、操作系统、编译器等等的底层机制,明确设计方案,还需要对不同的系统以及硬件环境做对应的

适配工作。我们在使用python的时候,在不同的系统或者硬件下感觉都一样,那是因为python本身为我们屏蔽了底层细节,在做这种python底层

hack的事情的时候,显然就没那么轻松了。

举个例子,由于CPU有很多种,例如i386、x86_64、arm等等,每种CPU的设计不尽相同,于是作者为每种CPU写了对应的汇编操作指令来完成栈的保存和替换,这些操作都是与操作系统和硬件高度绑定的。

虽然greenlet的实现这么bt,但就是有人做到了,加上gevent的封装,用起来比python自带协程好用太多。

我想任何对python比较熟悉的童鞋,在初次接触gevent的时候,都会好奇它是如何做到的,在进一步了解其底层greenlet实现机理之后,无不惊叹其鬼斧神工。

这种事情就是那种,别人不说,你可能永远不会想到的事情。

转载

当然,Python的黑魔法是所有的内省和动态绑定。

例如,Python可以重新绑定解释器的异常,以便在程序异常结束时可以进行一些自定义处理。

一旦你重置了异常钩子,一旦你的代码抛出一个异常,整个解释器的环境将被ipdb接管,然后被用作交互模式。通常,我将检查堆栈并pickle必要的对象,因此稍后再犯错误更容易。

由于IPython是一个非gui程序,所以即使在SSH中也可以使用它,这是SSH缺少IDE的完美解决方案。

动态绑定的另一个用途是,当程序依赖于修改后的库时,可以将修改后的部分剥离,并在运行时动态绑定到相应的库。

内省中,Python可以通过dir()和help()函数获取列表并帮助对象的成员,当您找不到库文档时,这些函数非常有用。只要开发人员在函数下面写注释,您就可以在帮助中看到它。

除了上面提到的特性之外,python还有一些小技巧,还有一些其他的答案。尽管它们中的许多都是语法上的糖,但它们可以使程序更有python:使用槽使成员静态,您可以节省大量的内存。装饰器,常用的功能,例如函数计时,也可以用来生成新的函数签名。函数签名可以影响传递检查和ide完成,这对于具有不确定的长参数的函数非常有用。许多库使用这种方法来处理不同版本的API。生成器,它可以为仅仅遍历数据保存大量的内存。参数也展开了。

典型的例子是zip(listx)和链(listx),它们分别对应于转置和连接。如果name==“main”:检查主程序是否被调用,主程序必须与多处理并行使用这个框。例如,枚举将列表转换为list2index可以用于((x,I)for I,枚举列表中的x(listx))namedtuple,生成类似于C语言的结构,并支持所有元组的语法。不初始化该词的defaultdictionary可以使用lambda来实现嵌套结构默认的结构的嵌套结构(lambda:defaultdictionary(int)),或者甚至是递归字典树=lambda:defaultdictionary(树)