专栏首页Python小屋Python使用修饰器强制函数只接收关键参数

Python使用修饰器强制函数只接收关键参数

前面发过一篇文章介绍了单独一个星号或斜线作为函数参数的含义,请查看:Python函数中单独一个星号或斜线作为形参的含义

如果需要强制函数的所有参数都必须以关键参数形式进行传值,可以在定义函数时把单独一个星号*作为函数第一个参数。例如

>>> def demo(*, a, b):

print(a, b)

>>> demo(a=1, b=2)

1 2

>>> demo(1, 2)

TypeError: demo() takes 0 positional arguments but 2 were given

也可以使用修饰器实现同样的功能,下面的代码首先定义了一个修饰器对函数的关键参数和位置参数进行检查,如果发现有位置参数与关键参数同名则抛出异常。

def mustBeKeywords(func):

import inspect

positions = inspect.getargspec(func).args

def wrapper(*args, **kwargs):

for pos in positions:

if pos not in kwargs:

raise Exception(pos+' must be keyword parameter')

return func(*args, **kwargs)

return wrapper

@mustBeKeywords

def demo(a, b, c):

print(a, b, c)

本文分享自微信公众号 - Python小屋(Python_xiaowu),作者:董付国

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-01-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python中的偏函数和函数柯里化

    偏函数(partial)和函数柯里化(currying)是函数式编程中常用的技术。有时候我们在复用已有函数时可能需要固定其中的部分参数,这除了可以通过默认值参数...

    Python小屋屋主
  • Python生成大量随机人员信息

    有时候我们会需要大量数据来演示或者测试某些功能,但是可能无法获得这些数据,或者担心泄露信息而不想使用真实数据。这时,我们可以自己生成一些随机数据。 impor...

    Python小屋屋主
  • 机器学习没有捷径,根据机器学习算法地图学习是最有效的一种方式!

    《机器学习与应用》由清华大学出版社出版,是机器学习和深度学习领域又一高质量的入门与提高教材。该书系统、深入地讲述了机器学习与深度学习的主要方法与理论,并紧密结合...

    Python小屋屋主
  • AutoML总结

    AutoML是指尽量不通过人来设定超参数,而是使用某种学习机制,来调节这些超参数。这些学习机制包括传统的贝叶斯优化,多臂老虎机(multi-armed band...

    marsggbo
  • 大数据技术之_16_Scala学习_09_函数式编程-高级

    第十三章 函数式编程-高级13.1 偏函数(partial function)13.1.1 提出一个需求,引出思考13.1.2 解决方式-filter + ma...

    黑泽君
  • C++多态

    当类存在虚函数时,编译器会为该类维护一个表,这个表就是虚函数表(vtbl),里面存放了该类虚函数的函数指针。在构造类的时候增加一个虚表指针(vptr)指向对应的...

    用户2929716
  • Linux性能优化篇-了解CPU上下文切换

    所以我们会比较好了解CPU密集型,需要大量计算资源,会非常消耗cpu,I/O密集型需要等待I/O,会有大量的不可中断进程,

    程序员小王
  • CS229 课程笔记之十五:强化学习与控制

    本章将开始介绍「强化学习」与适应性控制。在监督学习中,对于训练集我们均有明确的标签,算法只需要模仿训练集中的标签来给出预测即可。但对于某些情况,例如序列性的决策...

    口仆
  • C++基础多态(PolyMorphism)

    C++按照实现的时机分为编译时多态和运行时多态 1.编译时多态也成为静态连编,是指程序在编译的时候就确定了多态性,通过重载机制实现 2运行时多态又称为动态联...

    羊羽shine
  • raft 系列解读(4) 之 etcd-raft学习

    大多数Raft的实现都是整体设计,包括存储处理,消息序列化和网络传输,但是本raft库在实现的时候只实现了最核心的算法,换来了灵活性和性能,网络和disk IO...

    zhuanxu

扫码关注云+社区

领取腾讯云代金券