python代码,如何理解函数name/doc/code/args/kwargs?
发布于 作者:苏南大叔 来源:程序如此灵动~
大家在使用一个python函数或方法的时候,其实这个函数方法有一些特殊的属性,可以用于客观的分析这个函数或方法。那么,这些隐藏的函数辅助信息,又可以怎么使用呢?这就是本文中要解决的问题。

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和代码的故事。本文描述python函数的__name__、__doc__、*args以及**kwargs。测试环境:win10,python@3.6.8。
__name__及__doc__
这里先拿个简单的函数做例子:
def anyname(*args, **kwargs):
'''随便写的函数说明'''
print(type(args), args)
print(type(kwargs), kwargs)
print("name:", anyname.__name__)
print("doc :", anyname.__doc__).__name__,就指的是函数的名字,这个很好理解。但这名字能够被装饰器非显式改变,这是后话。.__doc__,这个可以作为函数的解释说明文字。注意定义的位置和方式。

*args以及**kwargs
这个写法只是约定俗称的,你也可以把args和kwargs换成别的名字。不过记得使用一个星号来标识args,使用两个星号来标识kwargs。
其实*args,**kwargs就代表了所有传入到函数或者方法内的参数。下面的代码是个例子:
def anyname(a1, *args, **kwargs):
'''随便写的函数说明'''
print(type(a1), a1)
print(type(args), args)
print(type(kwargs), kwargs)
anyname(123, "其余参数3", {"传递对象": "1", "也可以": "2"},
arg1="必须写在普通参数后面", arg2="可以写多个")
anyname("被匹配的参数", "单独参数注意逗号", arg1="写一个也行")
*args表示最普通的参数。- 函数里面可以使用传统方式接收参数,而
*args则接收剩余参数。 *args是个tuple元组类型,如果里面只有一个元素的时候,后面多一个逗号。**kwargs表示以一个object的各个属性形式传递的参数。**kwargs是个dict类型,必须放在*args之后,否则报错。
| 行参 | 实参 | 类型 | 使用 | 说明 |
|---|---|---|---|---|
| *args | "0",1,[0] | tuple元组 | args[0] | 传统方式接收参数,*args接收剩余的非**kwargs参数 |
| **kwargs | a1="0",a2=1 | dict字典 | kwargs["a2"] | 接收“xxx=xxx”类型的实参 |
__code__
这个__code__虽然不能打印出真正的python代码是什么。但是,可以指出对应函数逻辑的代码起始位置。注意,如果叠加了装饰器的话,是显示装饰器的对应位置。
print(anyname.__code__)输出类似如下:
<code object anyname at 0x0000027B51B548A0, file "c:/Users/sunan/Desktop/py/test.py", line 2>注意,查看最后的line2字样!
相关文章
综述
本文描述了如何认识python函数中的__name__还__doc__,以及如何获得所有传递进来的参数。本篇文章是为后续的装饰器文章做铺垫的。所以,还请关注后续有关装饰器的相关文章。