Python:避免Pylint关于参数过多的警告

81 投票
11 回答
170629 浏览
提问于 2025-04-15 11:22

我想把一个很大的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 个回答

48

你可以很简单地改变Pylint允许的最大参数数量。只需要打开你的 pylintrc 文件(如果还没有这个文件,可以生成一个),然后把:

max-args = 5

改成:

max-args = 6 # Or any value that suits you

根据Pylint的手册

设置适合你环境和编码标准的所有选项可能会很麻烦,所以可以使用一个rc文件来指定默认值。Pylint会查找 /etc/pylintrc 和 ~/.pylintrc。使用 --generate-rcfile 这个选项可以根据当前的配置生成一个带注释的配置文件,并输出到标准输出,然后退出。你可以在这个选项之前放其他选项,以便在配置中使用,或者先使用默认值,再手动调整配置。

80

你想要更好的方式来传递参数,还是只是想让Pylint别再烦你?如果是后者,你可以在代码里加一些控制Pylint的注释,像这样:

#pylint: disable=R0913

或者,更好的方式是:

#pylint: disable=too-many-arguments

记得在合适的时候把这些注释再打开。

我觉得,传递很多参数本身并没有什么问题,而那些建议把所有参数放在一个容器里的解决方案,其实并没有解决什么问题,只是让Pylint不再烦你而已 :-)。

如果你需要传递二十个参数,那就传吧。可能是因为你的函数做的事情太多了,重构一下代码可能会有帮助,这也是你应该考虑的。不过,除非我们看到“真实”的代码,否则我们无法做出这样的决定。

163

首先,引用一下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)

撰写回答