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__
,以及如何获得所有传递进来的参数。本篇文章是为后续的装饰器文章做铺垫的。所以,还请关注后续有关装饰器的相关文章。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。