python 函数定位参数+关键字参数+inspect模块

目录
  • 函数内省(function introspection)
  • 定位参数和仅限关键字参数
  • inspect模板

函数内省(function introspection)

除了__doc__属性, 函数对象还有很多属性,对于下面的函数,可以使用dir()查看函数具有的属性:

>>> dir(factorial) ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 

其中大多数是Python常规类都有的属性,下面重点看看常规对象没有而函数对象有的属性:

>>> class C:pass
...
>>> obj = C()
>>> def func():pass
...
>>> sorted(set(dir(func)) - set(dir(obj))) # 计算差集,然后排序
['__annotations__', '__call__', '__closure__', '__code__', '__defaults__', '__get__', '__globals__', '__kwdefaults__', '__name__', '__qualname__']

对于上面列出的函数特有属性,说明如下:

  • __annotations__ dict 参数和返回值的注释
  • __call__ method-wrapper 实现()运算符,即可调用对象的协议
  • __closure__ tuple 函数闭包,即自由变量的绑定(通常是None)
  • __code__ code 编译成字节码的函数元数据和函数定义体
  • __defaults__ tuple 形式参数的默认值
  • __get__ method-wrapper 实现只读描述符协议
  • __globals__ dict 函数所在的模块中的全局变量
  • __kwdefaults__ dict 仅限关键字形式参数的默认值
  • __name__ str 函数名称
  • __qualname__ str 函数的限定名称

定位参数和仅限关键字参数

def tag(name,*content,cls=None,**attrs):
if cls is not None:
attrs['class'] = cls

if attrs:
attrs_str = ''.join(' %s="%s" ' % (attr,value) for attr,value in sorted(attrs.items()))
else:
attrs_str=''
if content:
return '\n'.join('<%s %s >%s</%s>' % (name,attrs_str,c,name) for c in content)
else:
return '<%s%s />' % (name,attrs_str)
print(tag('br'))#定位参数 name
print(tag('p','hello'))#hello 会被*conteng捕获 存入元组content = ('hello')
print(tag('p','hello','world'))#content = ('hello','world')
print(tag('p','hello',id=33)) #attrs={'id':33} content = ('hello')
print(tag('p','hello','world',cls='sidebar'))#cls 关键字传入 cls='sidebar'
print(tag(content='testing',name='img'))#第一个参数name 也能作为关键字传入
#同名键会绑定到对应的具名参数上,剩余的则会被**attrs捕获
print(tag(**{'name':'img','title':'sunset boulevard','src':'sunset.jpg','cls':'framed'}))
#仅限关键字参数是python3.0新增的特性,在上例中,cls参数只能通过关键字参数指定,他一定不会捕获未命名的定位参数
#定义函数时候,如果想指定仅限关键字参数,要把它们放到*的参数后面
def f(a,*,b):
return a,b
ff = f(1,b=2)
print(ff)
<br />
<p >hello</p>
<p >hello</p>
<p >world</p>
<p id="33" >hello</p>
<p class="sidebar" >hello</p>
<p class="sidebar" >world</p>
<img content="testing" />
<img class="framed" src="sunset.jpg" title="sunset boulevard" />
(1, 2)

inspect模板

def tag(name,*content,cls=None,**attrs):
if cls is not None:
attrs['class'] = cls
if attrs:
attrs_str = ''.join(' %s="%s" ' % (attr,value) for attr,value in sorted(attrs.items()))
else:
attrs_str=''
if content:
return '\n'.join('<%s %s >%s</%s>' % (name,attrs_str,c,name) for c in content)
else:
return '<%s%s />' % (name,attrs_str)
import inspect
sig = inspect.signature(tag)
print(sig)
my_tag = {'name':'img','title':'sun long','src':'sunlong.jpg','cls':'framed'}
bound_args = sig.bind(**my_tag)
for name,value in bound_args.arguments.items():
print(name,'=',value)
print(bound_args)

inspect模块把实参绑定给函数调用:

(name, *content, cls=None, **attrs)
name = img
cls = framed
attrs = {'title': 'sun long', 'src': 'sunlong.jpg'}
<BoundArguments (name='img', cls='framed', attrs={'title': 'sun long', 'src': 'sunlong.jpg'})>

到此这篇关于python 函数定位参数+关键字参数+inspect模块的文章就介绍到这了,更多相关python inspect模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python使用正则表达式的search()函数实现指定位置搜索功能

    前面学习过search()可以从任意一个文本里搜索匹配的字符串,也就是说可以从任何位置里搜索到匹配的字符串.但是现实世界很复杂多变的,比如限定你只能从第100个字符的位置开始匹配,100个字符之前的不要匹配,这样的需求怎么样实现呢?来看下面的例子,它就是指定位置开始搜索: #python 3.6 #蔡军生 #http://blog.csdn.net/caimouse/article/details/51749579 # import re text = 'This is some text --

  • Python实现提取Excel指定关键词的行数据

    目录 一.需求描述 1.图片展示 2.提取方法 二.python提取第二版 1.图片展示 2.提取方法 一.需求描述 1.图片展示 从如图所示的数据中提取含有"python"."ubuntu"关键词的所有行数据,其它的不提取: 备注: 关键词和数据行列数可自定义!!! 提取前: 提取后: 2.提取方法 代码如下(示例): import xlrd import xlwt data = xlrd.open_workbook(r'shuju.xlsx') rtable =

  • Python超简单分析评论提取关键词制作精美词云流程

    目录  一.抓取全部评论 1.找到评论接口 2.Python 获取评论 二.文本分词.词云制作 1.文本分析 2.生成词云 3.初步效果-模糊不清 4.最终效果-高清无马  一.抓取全部评论 吾的这篇文章,有 1022 次评论,一条条看,吾看不过来,于是想到 Python 词云,提取关键词,倒也是一桩趣事. 评论情况: {'android': 545 次, 'ios': 110 次, 'pc': 44 次, 'uniapp': 1 次} 一个小细节:给我评论的设备中,安卓苹果比是 5:1. Bu

  • Python之inspect模块实现获取加载模块路径的方法

    该文主要介绍如何获取模块的路径,需要申明的是这里所说的模块可以是功能实现的该模块,也可以是别的模块. 使用到的是 inspect 模块的 .getsourcefile(需要获取的模块名) 创建test.py内容如下: import os import inspect class pathManager(object): def __init__(self): pass def _abPath(self): modulePath = inspect.getsourcefile(os) abPath

  • python 函数定位参数+关键字参数+inspect模块

    目录 函数内省(function introspection) 定位参数和仅限关键字参数 inspect模板 函数内省(function introspection) 除了__doc__属性, 函数对象还有很多属性,对于下面的函数,可以使用dir()查看函数具有的属性: >>> dir(factorial) ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__

  • python 函数的缺省参数使用注意事项分析

    本文实例讲述了python 函数的缺省参数使用注意事项.分享给大家供大家参考,具体如下: python的函数支持4种形式的参数:分别是必选参数. 缺省参数. 可变长参数.关键字参数:而且参数的书写顺序也是又一定规定的,顺序如下 def fun(param, default_params, arbitrary_params, keyword_param) 下面针对缺省型参数分析一些注意事项 先定义这样子一个函数 def test_fun(a=[]): a.append('a') print a i

  • Python函数中4种参数的使用教程

    1.必需的参数: 必须参数须以正确的顺序传入函数,调用的数量必须和声明时的一样 def f(name,age): print('I am %s,I am %d'%(name,age)) f('alex',18) f('alvin',16) 输出: I am alex,I am 18 I am alvin,I am 16 2关键字参数: 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值.使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数

  • python函数装饰器之带参数的函数和带参数的装饰器用法示例

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(func): def wrap(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print('运行时间为', end_time-start_time) return

  • 详细介绍Python函数中的默认参数

    import datetime as dt def log_time(message, time=None): if time is None: time=dt.datetime.now() print("{0}: {1}".format(time.isoformat(), message)) 最近我在一段Python代码中发现了一个因为错误的使用默认参数而产生的非常恶心的bug.如果您已经知道关于默认参数的全部内容了,只是想嘲笑一下我这可笑的错误,请直接跳到本文末尾.哎,这段代码是我

  • python函数的5种参数详解

    (1)       位置参数,调用函数时按位置传入参数 (2)       默认参数,即在函数定义时就给出参数的值,设置默认参数时要注意两点,一是必选参数在前,默认参数在后.二是把变化小的参数放在后面可作为默认参数.具有默认参数的函数被调用时可以不传入默认参数,若需要改变默认参数的值则可以赋值的形式调用该函数.若不按顺序提供默认参数则需要把参数名写上(即以赋值的形式).默认参数必须指向不变的参数(即不变对象,对象内部的数据一旦创建就不能改变,在多任务环境下同时读取对象不需要加锁) (3)    

  • Python函数中不定长参数的写法

    1.不定长参数的写法,用 *变量名 表示 2.不定长参数累加 3.不定长参数,使用**c接受m=23,n=56的值: 传参时,a必写,b.c可以缺省 def fun(a, b, *args): print(a) print(b) print(args) print("="*30) ret = a + b for i in args: ret += i return ret print(fun(1,2,3,4)) 结果: 1 2 (3, 4) ======================

  • 深入讲解Python函数中参数的使用及默认参数的陷阱

    C++里函数可以设置缺省参数,Java不可以,只能通过重载的方式来实现,python里也可以设置默认参数,最大的好处就是降低函数难度,函数的定义只有一个,并且python是动态语言,在同一名称空间里不能有想多名称的函数,如果出现了,那么后出现的会覆盖前面的函数. def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s 看看结果: >>> power(5) 25 >>> power(5,3

  • Python函数参数操作详解

    本文实例讲述了Python函数参数操作.分享给大家供大家参考,具体如下: 简述 在 Python 中,函数的定义非常简单,满足对应的语法格式要求即可.对于调用者来说,只需关注如何传递正确的参数,以及获取相应的返回值就足够了,无需了解函数的内部实现(除非想学习.跟踪源码). 话虽如此,但对于函数的定义来说,灵活性非常高.除了常规定义的必选参数以外,还支持默认参数.可变参数.以及关键字参数.这样以来,不但能处理复杂的参数,还可以简化调用者的代码. 形参和实参 不止 Python,几乎所有的编程语言都

  • python 函数中的参数类型

    1.前言 Python中函数的参数类型比较丰富,比如我们经常见到*args和**kwargs作为参数.初学者遇到这个多少都有点懵逼,今天我们来把Python中的函数参数进行分析和总结. 2.Python 中的函数参数 在Python中定义函数参数有5种类型,我们来一一演示它们. 2.1必选参数 必须参数是最基本的参数类型,当你在Python函数中定义一个必选参数时,每次调用都必须给予赋值,否则将报错. >>>def fun(a): print("a=",a) >

随机推荐