当前位置: 首页 > news >正文

【python】 args和kwargs区别

1. 问题代码

def test_kwargs(**kwargs):for k, v in kwargs.items():print ('Optional argument %s (kwargs): %s' % (k, v))dict1={'name':'nicole','address':'65 nanjing ave','phone': '2342342123'}
test_kwargs(dict1)报错:
TypeError: test_kwargs() takes 0 positional arguments but 1 was given

2. 根因分析

通过观察函数定义def test_kwargs(**kwargs):可以,需要的是一个可变关键字参数,但是函数调用时test_kwargs(dict1),实际传递的是位置参数,所以导致报错;

3. 概念解释

3.1 位置参数

位置参数:不是一个出现在函数定义时的概念,而是一个出现在函数调用时的概念。

def fun_positional_parameters(param1, param2):return param1 - param2print(fun_positional_parameters(5, 2))
-------------------------------------------------------------------------------
3

3.2 关键字参数

关键字参数是指使用键值对的形式key=values来确定输入的参数值。

#关键字参数:不是一个出现在函数定义时的概念,而是一个出现在函数调用时的概念。
#关键字参数是指使用键值对的形式key=values来确定输入的参数值。
def fun_keyword_parameters(param1, param2):return param1 - param2print(fun_keyword_parameters(param1=5, param2=2))
---------------------------------------------------------------------------
3

3.3 关键字参数和位置参数混合使用

# 关键字参数和位置参数混合使用时,必须位置参数在前,否则报错;
# 位置参数在前,关键字参数在后
print(fun_keyword_parameters(5, param2=2))
-------------------------------------------------------------------------
3

*args**kwargs的使用

args是argments的缩写,表示位置参数;
kwargs是keywords arguments的缩写,表示关键字参数;
*args传递一个可变参数列表给函数实参;
**kwargs 传递一个可变的关键字参数列表给函数实参;

def test_kwargs(first, *args, **kwargs):print('Required argument: ', first)print(type(kwargs))for v in args:print ('Optional argument (args): ', v)for k, v in kwargs.items():print ('Optional argument %s (kwargs): %s' % (k, v))test_kwargs(1, 2, 3, 4, k1=5, k2=6)# args类型是一个tuple,而kwargs则是一个字典dict,并且args只能位于kwargs的前面。代码的运行结果如下Required argument:  1
<class 'dict'>
Optional argument (args):  2
Optional argument (args):  3
Optional argument (args):  4
Optional argument k2 (kwargs): 6
Optional argument k1 (kwargs): 5

数据类型转换过程

argsparse.Namespacedict ⇒ 位置参数;


class DtProcessor:"""dt数据处理类"""def __init__(self, **kwargs):self.dts_data = kwargs.get("ds_data", [])self.output_dir = os.path.join(os.getcwd(), 'output')def parse_args():parser = argparse.ArgumentParser(description="Generate")parser.add_argument("--prt", type=str, default="K", help="Type of to generate (e.g.,  ).")parser.add_argument("--ver", type=str, default="28", help=" ")return parser.parse_args()if __name__ == "__main__":args = parse_args()			# 类型argsparse.Namespaceargs_dict = vars(args)		# 转成字典print(args_dict)print("type:args", type(args))print("type:args_dict", type(args_dict))dts_inst = DtsProcessor(**args_dict)	# 将字典解包成可变位置参数pk_gen = create_generator()print(pk_gen.generate())

REF

  1. Python中的*args和**kwargs
  2. python函数(4)— 位置参数和关键字参数

相关文章:

  • 【git】有两个远程仓库时的推送、覆盖、合并问题
  • HarmonyOS Grid 网格拖拽完全指南
  • Vue 3 路由跳转全面指南(Composition API + <script setup>)
  • 高效便捷版,多功能一键直达!
  • 行为设计模式之Strategy(策略)
  • 深入理解滑动窗口算法:原理、应用与 C++ 实现
  • 行列式的性质 线性代数
  • Go语言--语法基础5--基本数据类型--输入输出(2)
  • 自主学习-《Absolute Zero: Reinforced Self-play Reasoning with Zero Data》
  • 用Jmeter进行接口测试
  • HarmonyOSNext性能核弹:用Node-API引爆ArkTS/C++跨语言
  • MySQL事务:从原理到实践
  • 软件测试用例(一)
  • 私域到底怎么做?
  • 【分析学】 从确界定理出发——实数系完备定理
  • 第十七章:SD如何制作三视图(基础)
  • 如何写一个简单的python类class
  • Gartner《Reference Architecture for Federated Analytics》学习心得
  • Unity Addressable使用之入门篇
  • WebAssembly的本质与核心价值
  • 丹东网站推广/日照seo优化
  • wordpress4.8优化/seo和sem的区别是什么
  • 湛江网站建设制作费用/武汉网站seo推广
  • 网站延迟加载/三台网站seo
  • 网站建设为啥每年都要收费/阐述网络推广的主要方法
  • 做招投标应该了解的网站/中国广告公司前十强