需求分析
最近遇到这样一个需求:根据用户传递的不同参数数量执行不同的功能。我这几天一直在思考这个问题:如何根据参数数量去执行不同的功能,最初的设想是把不需要的参数设置为NONE或者""再或者" "(后两者引号均表示传空值的意思),但是呢,运行的时候对这些为空的参数会出现解析错误,导致我很烦,明明paser解析的时候可以使这些参数为空,为什么我传参数就不能为空???气死气死,一定是代码的问题。哦,等等,代码的问题,那不就是我的问题?不解决问题就解决出问题的人,我这么自爱,我选择解决问题。
初步设想
这个需求很明显是函数重载(关于函数重载,请参考这个链接):无非就是把代码copy几份,然后将函数的参数列表改为每个功能所需要的即可,调用的时候只需判断一下调用的哪个功能就执行哪个函数就ok了,perfect!!!
but,wait,wait!我这主函数的代码可是都杂糅在一起 ,有800多行,复制三份就是2400多行,关键是,绝大部分代码都是不动,改变的只有一小部分而以。我要这样做,真传出去,还不说我是个小白!!!不能忍,坚决不能忍!
进一步构想
我记得python中有一个参数"**args"可以处理多个变量的问题,干脆用这个!
改完这个之后,我原来的args就不能用了,很显然(其实也没那么显然,我是看了报错信息才知道的),命名冲突了。于是把原来的args换成了其他的(如opt)就可以了。但是但是,又报错了!!!
TypeError: main() takes 0 positional arguments but 3 were given
啊,这!还有人嫌参数少?不应该啊,查一下!
在 Python 中,
*args
和**kwargs
分别用于接受可变数量的位置参数和关键字参数。如果你将*args
写成了**args
,会导致错误,因为它们的语法和含义是不同的。当你使用
**args
时,Python 会认为你正在使用关键字参数字典。这会导致将传递的关键字参数收集到一个字典中,而不是像*args
那样收集位置参数到元组中。由于这两种参数类型是不同的,因此将*args
写成**args
会导致语法错误。
斯高一,原来是多给了一个星,还是不能太大方,该一个就一个!改完之后,完美运行!
完结撒花
解决完这个之后第一想法就是写下来纪念自己又蠢又笨的经历,写下来还挺轻松的。当然可变参数数量不仅可以用“*args”还可以用“**kwargs”,朋友们,我说什么朋友们,不怪我记错,是他俩太像,导致我记混了!那希望大家不要混淆,详细的用法请查看:*args & **kwargshttps://www.geeksforgeeks.org/args-kwargs-python/也可以看这位博主:【Python】`*args` 和 `**kwargs`的用法【最全详解】https://blog.csdn.net/GODSuner/article/details/117961990?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-117961990-blog-125363261.235%5Ev38%5Epc_relevant_default_base3&spm=1001.2101.3001.4242.2&utm_relevant_index=4