我是Python和更高级语言的新手,所以我想知道如果我有一个接受大量参数的函数,以及如何更好地构建我的代码以防止这种情况,我是否会被忽视。 / p>
例如,此函数实际上正在执行的操作是在文件中打印字符串的每个位置。
def scan(fpin,base,string,pNo,print_to_file,dumpfile_path,quiet):
从main函数调用此函数,该函数基本上解析命令行参数并将数据传递给扫描函数。我曾想过创建一个包含所有这些参数并将其传递给扫描的类,但是只有一个这样的数据实例,所以这不是没有意义的吗?
答案 0 :(得分:6)
命名参数是你的朋友。对于具有合理默认值的半可选配置选项,请为参数指定默认值,并仅为非默认情况传递它们(作为命名参数)。如果有许多参数没有合理的默认值,那么您可能希望在调用函数时为所有参数命名。
考虑内置函数sorted
。它最多需要四个参数。 reverse
之前或之后的cmp
参数是?如果我想要默认行为,我应该以{{1}}传递什么?答:如果我记得的话,好吧。我打电话给key
,它就是我所期待的。
顺便说一句,如果我有大量的“配置”式参数,我每次都会调用扫描,而且每次只更改(例如sorted(A, reverse=True)
和fpin
),我可能会倾向于将所有其他参数放入字典中,然后使用string
语法将其传递给函数。这有点先进。有关详细信息,请参阅手册(注意,这与将函数声明为取**kwargs
不同。函数定义是相同的,唯一的区别是调用它的样子。)
答案 1 :(得分:1)
不,它真的没什么不对。如果你有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')
等