代码之家  ›  专栏  ›  技术社区  ›  Anonymous

python:避免关于参数过多的pylint警告

  •  36
  • Anonymous  · 技术社区  · 17 年前

    我想把一个大的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)
    

    但这种方法对我来说很难看,它需要编写很多甚至是多余的代码。

    有更好的办法吗?

    9 回复  |  直到 7 年前
        1
  •  86
  •   w43L    9 年前

    首先,一个 Perlis's epigrams :

    “如果你有一个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)
    
        2
  •  35
  •   paxdiablo    11 年前

    你想用更好的方式来传递论点还是仅仅是一种停止的方式 pylint 从给你一段艰难的时光?如果是后者,我似乎记得你可以通过 皮林特 -控制代码中的注释,大致如下:

    #pylint: disable-msg=R0913
    

    或:

    #pylint: disable-msg=too-many-arguments
    

    记得尽快打开它们。

    在我看来,没有什么 固有地 错误的做法是传递大量的参数和解决方案,主张将它们全部打包到某个容器参数中,这样做并不能真正解决任何问题,除非停止 皮林特 别再唠叨你了。

    如果你需要传递20个参数,那么就传递它们。这可能是必需的,因为您的函数做得太多,重新分解可能会有帮助,这是您应该考虑的问题。但这不是决定 我们 除非我们看到真正的代码是什么,才能真正做到。

        3
  •  21
  •   Chris    8 年前

    您可以轻松地更改PyLLT中参数的最大允许数量。只需打开pylintrc文件(如果还没有,则生成该文件)并更改:

    最大ARGS=5

    到:

    最大参数=6或任何适合您的值

    来自派林特的 manual

    指定所有合适的选项 对于您的设置和编码标准 可以是乏味的,所以有可能 使用rc文件指定默认值 价值观。pylint查找/etc/pylintrc 还有~/.pylintrc。--generate rcfile 选项将生成注释 配置文件根据 当前标准配置 输出和退出。你可以放别人 在此之前使用它们的选项 配置,或从 默认值并手动调整 配置。

        4
  •  12
  •   hbw    17 年前

    你可以试着用 Python's variable arguments 特点:

    def myfunction(*args):
        for x in args:
            # Do stuff with specific argument here
    
        5
  •  7
  •   Brian Rasmussen    17 年前

    也许您可以将一些参数转换为成员变量。如果你需要那么多的州,我觉得上课是个好主意。

        6
  •  6
  •   Dave    17 年前

    简化或分解该函数,使其不需要9个参数(或忽略pylint,但像您提议的那样闪避,从而破坏lint工具的用途)。

    编辑:如果这是一个临时措施,请按如下所述使用注释禁用有关特定功能的警告: http://lists.logilab.org/pipermail/python-projects/2006-April/000664.html

    稍后,您可以对所有禁用警告进行GRIP。

        7
  •  4
  •   Igor Stoppa    11 年前

    对帕西亚布洛的回答发表评论-因为我没有足够的声誉直接发表评论:-/

    我不喜欢提到这个数字,合成词的名字更具表现力,并且避免了添加一个随着时间推移可能会过时的注释。

    所以我宁愿:

    #pylint: disable-msg=too-many-arguments
    

    我也建议不要让它悬在那里:它将一直保持活动状态,直到文件结束或被禁用,以先到者为准。

    做得更好:

    #pylint: disable-msg=too-many-arguments
    code_which_would_trigger_the_msg
    #pylint: enable-msg=too-many-arguments    
    

    我还建议每行启用/禁用一个警告/错误。

        8
  •  0
  •   easel    17 年前

    python有一些很好的函数式编程工具,它们很可能很好地满足您的需求。退房 lambda functions map . 而且,你在使用听写的时候,似乎你会得到更好的列表服务。对于您提供的简单示例,请尝试以下习惯用法。请注意,地图会更好更快,但可能不符合您的需要:

    def mysum(d):
       s = 0  
       for x in d:
            s += x
       return s
    
    def mybigfunction():
       d = (x1, x2, x3, x4, x5, x6, x7, x8, x9)
       return mysum(d)
    

    你提到过有很多局部变量,但坦白地说,如果你处理的是列表(或元组),你应该使用列表,并从长远来看排除所有这些局部变量。

        9
  •  -1
  •   Ants    7 年前

    我遇到了同样的麻烦错误,我意识到这与pycharm自动检测到的一个很酷的特性有关……只要添加@staticmethod decorator,它就会在使用该方法的地方自动删除该错误。