Python函数有很多参数

6

我对Python和其他高级语言都很陌生,所以我想知道如果我有一个接收很多参数的函数,这是否被认为是不好的,并且如何更好地构建我的代码以防止出现这种情况。

例如,这个函数的实质就是打印文件中每个字符串位置。

def scan(fpin,base,string,pNo,print_to_file,dumpfile_path,quiet):

这个函数是从主函数调用的,主要是解析命令行参数并将数据传递给扫描函数。我考虑过创建一个包含所有这些参数并将其传递给扫描的类,但由于这些数据只有一个实例,所以这样做是没有意义的。


3
除了下面提到的所有好的解决方案之外,您还可以考虑重构您的函数。如果它需要这么多参数,也许它正在做很多不同的事情?也许您可以将其中一些过程隔离并抽象出来成为不同的函数? - Pawel Miech
2个回答

6
命名参数是你的朋友。对于像半可选配置选项一样具有合理默认值的内容,请为参数提供默认值,并仅在非默认情况下将它们作为命名参数传递。如果有很多没有合理默认值的参数,则在调用函数时可能需要为所有参数命名。
考虑内置函数sorted。它最多可以接受四个参数。参数reversecmp之前还是之后?如果我想要默认行为,应该传入什么作为key?答案是:我不记得了。我调用sorted(A, reverse=True),它做了我期望的事情。
顺便说一句,如果我有大量“配置”样式的参数,每次调用扫描时都要传递它们(比如fpinstring),我可能会倾向于将所有其他参数放入字典中,然后使用**kwargs语法将其传递给函数。那有点高级。有关详细信息,请参见手册。(请注意,这与声明函数为采用**kwargs不同。函数定义相同,唯一的区别在于调用它的方式。)

2

并没有什么问题。如果你有 N 个不同的参数(控制函数执行的事物),那么你必须以某种方式传递它们 - 如果你问我的话,实际上如何传递只是用户偏好。

然而... 如果你发现自己做了这样的事情:

func('somestring', a=A, b=B, c=C)
func('something else', a=A, b=B)
func('something third', a=A, c=C, d=D)

如果你需要处理很多配置不同的事情,比如A、B、C等,那么你应该考虑使用一个类。类可以完成很多功能,同时也能够创建上下文。这样,你就可以编写如下代码:

cf = myclass(a=A, b=B, c=C, d=D)
cf.func('somestring')
cf.func('something else')
cf.func('something third')

etc.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接