Python:避免Pylint关于参数过多的警告
我想把一个很大的Python函数拆分成几个小的函数。比如,看看下面这段代码:
x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
当然,这只是一个简单的例子。实际上,代码会复杂得多。我的意思是,这段代码里有很多局部变量,需要传递给提取出来的新函数,可能会像这样:
def mysum(x1, x2, x3, x4, x5, x6, x7, x8, x9):
x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
return x
问题是,Pylint会发出警告,提示参数太多了。
我可以通过做一些事情来避免这个警告,比如:
def mysum(d):
x1 = d['x1']
x2 = d['x2']
...
x9 = d['x9']
x = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9
return x
def mybigfunction():
...
d = {}
d['x1'] = x1
...
d['x9'] = x9
x = mysum(d)
但我觉得这种方法看起来很糟糕。它需要写很多重复的代码。
有没有更好的方法呢?
11 个回答
你可以很简单地改变Pylint允许的最大参数数量。只需要打开你的 pylintrc 文件(如果还没有这个文件,可以生成一个),然后把:
max-args = 5
改成:
max-args = 6 # Or any value that suits you
根据Pylint的手册
设置适合你环境和编码标准的所有选项可能会很麻烦,所以可以使用一个rc文件来指定默认值。Pylint会查找 /etc/pylintrc 和 ~/.pylintrc。使用 --generate-rcfile 这个选项可以根据当前的配置生成一个带注释的配置文件,并输出到标准输出,然后退出。你可以在这个选项之前放其他选项,以便在配置中使用,或者先使用默认值,再手动调整配置。
你想要更好的方式来传递参数,还是只是想让Pylint别再烦你?如果是后者,你可以在代码里加一些控制Pylint的注释,像这样:
#pylint: disable=R0913
或者,更好的方式是:
#pylint: disable=too-many-arguments
记得在合适的时候把这些注释再打开。
我觉得,传递很多参数本身并没有什么问题,而那些建议把所有参数放在一个容器里的解决方案,其实并没有解决什么问题,只是让Pylint不再烦你而已 :-)。
如果你需要传递二十个参数,那就传吧。可能是因为你的函数做的事情太多了,重构一下代码可能会有帮助,这也是你应该考虑的。不过,除非我们看到“真实”的代码,否则我们无法做出这样的决定。
首先,引用一下Perlis的一句名言:
“如果你有一个程序需要10个参数,那你可能漏掉了一些。”
这10个参数中,有些可能是相关的。你可以把它们放在一个对象里,然后把这个对象传过去。
为了更好地说明这个问题,我举个例子,因为问题本身的信息不够直接回答:
class PersonInfo(object):
def __init__(self, name, age, iq):
self.name = name
self.age = age
self.iq = iq
然后,你的这个需要10个参数的函数:
def f(x1, x2, name, x3, iq, x4, age, x5, x6, x7):
...
可以变成:
def f(personinfo, x1, x2, x3, x4, x5, x6, x7):
...
而调用这个函数的地方也要改成:
personinfo = PersonInfo(name, age, iq)
result = f(personinfo, x1, x2, x3, x4, x5, x6, x7)