【Python 小技巧】函数按参数名接收所需参数

场景

在开发中,我们会定义很多函数,很多时候,函数的参数来自与其他函数处理的结果,而且函数间的参数很多,每次赋值都比较麻烦,为了方便理解,这里给出一个最小示例。

def funcA():
    return {
        "name": "二两",
        "age": "30",
        "hobby": ["code", "read", "girl"],
        "job": "software engineer"
    }

@choose_params
def funcB(name, age, job):
    print(name, age, job)

def main():
    res = funcA()
    # 很麻烦
    funcB(name=res['name'],
          age=res['age'],
          job=res['job'])
    
main()

解决

我想着,funcA 返回 dict 后,funcB 直接通过 **dict 的方式获得 funcB 需要的同名参数则可。

我们可以使用 inspect 内置库获得函数所有的参数名,示例如下:


In [1]: def funcB(name, age, job):
   ...:     print(name, age, job)
   ...:

In [2]: import inspect

In [4]: inspect.getfullargspec(funcB).args
Out[4]: ['name', 'age', 'job']

inspect 内置库用处很多,主要可以实现下面的一些常见需求

  • 1. 对类,模块的操作,成员,类,模块类型的判断

  • 2. 获取源码

  • 3. 获取类或函数的参数信息

  • 4. 解析堆栈

基于「inspect.getfullargspec (funcB).args」,我们可以写一个装饰器,试一下 funcB (**res) 可以正常使用 funcB 的效果,装饰器代码如下:

import functools
import inspect

def choose_params(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        # 被装饰方法参数的名称
        varnames = inspect.getfullargspec(func).args
        _params = {k: kwargs.get(k) for k in varnames}
        if 'self' in _params:
            # 装饰类中方法时,去除self
            del _params['self']
        res = func(*args, **_params)
        return res
    return wrapper

使用上装饰器后,一开始示例的完整代码如下:

import functools
import inspect

def choose_params(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        varnames = inspect.getfullargspec(func).args
        _params = {k: kwargs.get(k) for k in varnames}
        if 'self' in _params:
            del _params['self']
        res = func(*args, **_params)
        return res
    return wrapper

def funcA():
    return {
        "name": "二两",
        "age": "30",
        "hobby": ["code", "read", "girl"],
        "job": "software engineer"
    }

@choose_params
def funcB(name, age, job):
    print(name, age, job)


def main():
    res = funcA()
    
    funcB(**res)
    
main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒编程-二两

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值