大家在使用一个python函数或方法的时候,其实这个函数方法有一些特殊的属性,可以用于客观的分析这个函数或方法。那么,这些隐藏的函数辅助信息,又可以怎么使用呢?这就是本文中要解决的问题。

苏南大叔:python代码,如何理解函数name/doc/code/args/kwargs? - 函数分析
python代码,如何理解函数name/doc/code/args/kwargs?(图3-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和代码的故事。本文描述python函数的__name____doc__*args以及**kwargs。测试环境:win10python@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__,这个可以作为函数的解释说明文字。注意定义的位置和方式。

苏南大叔:python代码,如何理解函数name/doc/code/args/kwargs? - 函数name和doc
python代码,如何理解函数name/doc/code/args/kwargs?(图3-2)

*args以及**kwargs

这个写法只是约定俗称的,你也可以把argskwargs换成别的名字。不过记得使用一个星号来标识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="写一个也行")

苏南大叔:python代码,如何理解函数name/doc/code/args/kwargs? - 参数匹配
python代码,如何理解函数name/doc/code/args/kwargs?(图3-3)

  • *args表示最普通的参数。
  • 函数里面可以使用传统方式接收参数,而*args则接收剩余参数。
  • *args是个tuple元组类型,如果里面只有一个元素的时候,后面多一个逗号。
  • **kwargs表示以一个object的各个属性形式传递的参数。
  • **kwargs是个dict类型,必须放在*args之后,否则报错。

__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__,以及如何获得所有传递进来的参数。本篇文章是为后续的装饰器文章做铺垫的。所以,还请关注后续有关装饰器的相关文章。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。