装逼利器函数注释

说实话两年来,我从来没有如此的关注过注释,不说话先上代码

def add(a, b) -> 0:
    result = a + b
    add.__annotations__[‘return‘] += result
    return result
print(add.__annotations__[‘return‘])  #0

add(3, 4)
print(add.__annotations__[‘return‘])  #7

add(5, 5)
print(add.__annotations__[‘return‘])  #10

这是python3.3的新的函数注释方式,不支持2,亲试

具体可以有下面三种方式

方式一:  下面的注释参数m:后面是注释,v:后面是注释,->后面是返回值

>>> def kinetic_energy(m:‘in KG‘, v:‘in M/S‘)->‘Joules‘:
...    return 1/2*m*v**2
...
>>> kinetic_energy.__annotations__
{‘return‘: ‘Joules‘, ‘v‘: ‘in M/S‘, ‘m‘: ‘in KG‘}

方式二:注释可以为返回值

>>> rd={‘type‘:float,‘units‘:‘Joules‘,‘docstring‘:‘Given mass and velocity returns kinetic energy in Joules‘}
>>> def f()->rd:
...    pass
>>> f.__annotations__[‘return‘][‘type‘]
<class ‘float‘>
>>> f.__annotations__[‘return‘][‘units‘]
‘Joules‘
>>> f.__annotations__[‘return‘][‘docstring‘]
‘Given mass and velocity returns kinetic energy in Joules‘

  

方式三:

def validate(func, locals):
    for var, test in func.__annotations__.items():
        value = locals[var]
        try:
            pr=test.__name__+‘: ‘+test.__docstring__
        except AttributeError:
            pr=test.__name__
        msg = ‘{}=={}; Test: {}‘.format(var, value, pr)
        assert test(value), msg

def between(lo, hi):
    def _between(x):
            return lo <= x <= hi
    _between.__docstring__=‘must be between {} and {}‘.format(lo,hi)
    return _between

def f(x: between(3,10), y:lambda _y: isinstance(_y,int)):
    validate(f, locals())
    print(x,y)

  

>>> f(2,2)
AssertionError: x==2; Test: _between: must be between 3 and 10
>>> f(3,2.1)
AssertionError: y==2.1; Test: <lambda>

方法总结:

1、在参数后面加注释,可以替代常规默认参数

2、函数名括号后面是返回值对应的value,相当于函数的默认返回值

3、通过__annotations__ 来获取所有的注释信息

通过上面的代码示例,开头代码就总结了几乎所有方法

def add(a:1, b:"aaa") -> 0:
    result = a + b
    add.__annotations__[‘return‘] += result
    return result
print(add.__annotations__[‘return‘])
print(add.__annotations__.items())

add(3, 4)
print(add.__annotations__[‘return‘])

add(5, 5)
print(add.__annotations__[‘return‘])

打印结果:

0
dict_items([(‘b‘, ‘aaa‘), (‘return‘, 0), (‘a‘, 1)])
7
17

为什么这种注释方式我如此的重视?

这种逆天的注释方式,不再是常规的文本方式注释用来解释,而是以一种反射的机制来进行注释,真正做到灵活多变物尽其用

一句话:

They have the potential to usher in a new era of introspective tools that help developers master more and more complex systems. They also offer the more advanced developer a standard and readable way to associate metadata directly with arguments and return value in order to create custom tools and interact with decorators.

具体文档

时间: 2024-10-15 16:32:58

装逼利器函数注释的相关文章

海涛师兄指的路--指点汇总--各种装逼利器---15.01.27

14.11.10--科学楼226 C primer plus 代码敲两边许英杰老师 ---------------------------- www.gfsoso.com谷粉搜搜正点原子.安富莱(bbs.armfly.com) 资料: 别人的教程:原子的.野火的 user manual(中文用户手册) datasheet -----------------------------------1.stm32启动---->搞懂时钟(1)2.流水灯(1)3.串口.(1)4.stm32+emwin+uc

利用Python实现导弹自动追踪!室友面前的装逼利器!史上最详细!

不好意思 ,上传错了.接着看图! 由于待会要用pygame演示,他的坐标系是y轴向下,所以这里我们也用y向下的坐标系. 算法总的思想就是根据上图,把时间t分割成足够小的片段(比如1/1000,这个时间片越小越精确),每一个片段分别构造如上三角形,计算出导弹下一个时间片走的方向(即∠a)和走的路程(即vt=|AC|),这时候目标再在第二个时间片移动了位置,这时刚才计算的C点又变成了第二个时间片的初始点,这时再在第二个时间片上在C点和新的目标点构造三角形计算新的vt,然后进入第三个时间片,如此反复即

Flask:10-项目部署(02):让更多的朋友访问你的装逼利器

项目部署 WEB工作原理 客户端(chrom) <=> WEB服务器(nginx) <=> WSGI(uWSGI) <=> Python(Flask) <=> 数据库(MySQL) Flask框架自带一个测试服务器,开发时直接运行即可:但是在生成环境中,必须进行完整部署. nginx服务器 安装:sudo apt-get install nginx 添加虚拟主机: 在/etc/nginx/sites-available目录下创建虚拟主机配置文件www.blo

程序员装逼指南(转)

程序员嘛,外行人看起来已经是不可理解的奇怪生物了,自然也没必要跟他们再装逼 所以呢,如何对其他程序员装逼就是一门很有学问的事了 ---------------------------------------------------- 一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高. 2.椅子不一定要舒服,但是一定要可以半躺着. 3.大量的便签,各种的颜色

VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启)

VopSdk一个高逼格微信公众号开发SDK(源码下载) VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启) 针对第一版,我们搞了第二版本,老规矩先定个目标. 一 我们的目标 a.移除PayExcute,统一执行入口,目前只保留一个入口Excute b.序列化特性统一,目前只用设置xml特性即可(反序列化时xml和json都可以直接用) c.支持文件上传,目前只有多客服管理上传头像接口用到过 d.使用T4模板自动生产所有Request.Response.以及所有测试Test(装

逗比之——程序员装逼手册3(逆袭版)

程序员嘛,外行人看起来已经是不可理解的奇怪生物了,自然也没必要跟他们再装逼 所以呢,如何对其他程序员装逼就是一门很有学问的事了 于是乎在下手痒写了个<高级程序员装逼指南>,请大家指正 ** 编程语言 ** 千万千万千万千万不要说自己是Java/C#/C++程序员 尽量学一些奇怪的语言,python已经有烂大街的趋势了,写写还是可以,装逼是用不上了 Lisp和Erlang都是装逼的好语言 当然你要是号称会Haskell就更牛X了,实在不会也没关系,发发跟Haskell有关的状态别人也很装了 没事

程序猿装逼从注释开始

装逼哥带大家弄个装逼的注释.看效果,程序猿也可以有艺术细胞,有没有? 格式化代码后 明显不一样,但不要紧,复制到Eclipse里.禁止Eclipse格式化你注释的代码!干. /* ____________________________________________________ | | | 删除第一页数据中的某一项,再去请求第二页数据,第二页数据会少一条 | | Tracy的解决方案是,要求我们删除后就刷新数据. | | 这里就判断下,我们是否需要刷新数据,如果第一页就5.6条,表示满 |

【转】这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已

[转]这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已 Javascript是一门很吊的语言,我可能学了假的JavaScript,哈哈,大家还有什么推荐的 本文秉承着:你看不懂是你SB,我写的代码就要牛逼. 1.单行写一个评级组件 "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);定义一个变量rate是1到5的值,然后执行上面代码,看图 才发现插件什么的都弱爆了 2.如何装逼用代码骂别人SB (!(~+[])+{})[--[~+&qu

逆向入门之路2 Hello World (论装逼准备工作的重要性)

大部分的编程语言都是从hello world开始,我们的逆向学习也从Hello World开始! 先写一个程序: #include <windows.h> int main() { MessageBoxA(0, "world", "tip", 0); } 没错,就是这么短小~~~~ 编译运行后的结果是这样的: 然后我们删掉源代码,没错,就是删掉源代码~~~ 我们要在只有二进制文件的情况下把他改造成一个hello world程序. 打开萌萌的OD,载入程序