点击和 pylint

问题描述 投票:0回答:5

这是一个使用 click 导致 pylint 错误的简单示例:

@click.command()
@click.option('--option', is_flag=True)
def foo(option):
    click.echo(option)

foo()

foo
没有收到任何参数,因此我得到 E1120(无参数值)。 所以我这样做了:

@click.command()
@click.option('--option', is_flag=True)
def foo(**kwargs):
    click.echo(kwargs["option"])

foo()

有更好的方法吗? 或者一种在 Visual Studio Code 中仅禁用一行 pylint 的方法?

python python-3.x visual-studio-code pylint python-click
5个回答
47
投票

@click.command
装饰器编辑你的函数参数,但 pylint 不知道这一点,因为它实际上并不运行你的代码。

我认为为了让 pylint 高兴而让你的代码变得奇怪是没有意义的。相反,请忽略它,或添加注释以在当前范围内禁用该警告:

# pylint: disable=no-value-for-parameter

10
投票

同时,pylint 作者添加了一种处理此问题的方法:

signature-mutators
设置。

这应该告诉 pylint 点击会改变函数签名,并且 它应该看起来更深一点:

# .pylintrc
...
signature-mutators=click.decorators.option

pylint
检查被调用函数的装饰器的名称/限定名称是否在
signature-mutators
列表中。因此,我们不能使用
click.option
,因为这是一个别名,但我们必须使用 declared 名称。

为了完整起见,我认为我们可以添加在

click/decorators.py
中找到的所有装饰器:

[TYPECHECK]
signature-mutators=click.decorators.option,
                   click.decorators.argument,
                   click.decorators.version_option,
                   click.decorators.help_option,
                   click.decorators.pass_context,
                   click.decorators.confirmation_option

注意:此设置需要位于

[TYPECHECK]
部分下。 (谢谢@Federico Corazza)


7
投票

有一种方法可以避免这些错误的发生,即不使用装饰语法。这可能就是 @Azsgy 所说的“奇怪”:-)

@click.option(
    "--direction",
    default="upgrade",
    type=click.Choice(["upgrade", "downgrade"]),
    help="Direction of migration upgrade/downgrade",
)
@click.argument("revision", default="heads")
def _main(direction, revision):
    """Runs migrations on each of the databases."""
    pass


main = click.command()(_main)


if __name__ == "__main__":
    main()

好与不好还有待商榷:-)


2
投票

@xtofl 的解决方案有效。请注意,选项应位于名为

TYPECHECK
:

的标题下方
[TYPECHECK]
signature-mutators=click.decorators.option,
                   click.decorators.argument,
                   click.decorators.version_option,
                   click.decorators.help_option,
                   click.decorators.pass_context,
                   click.decorators.confirmation_option

可能其他人提出了解决此问题的编辑,因为如果我尝试修改@xtofl的解决方案,我会得到“建议的编辑队列已满”。


0
投票

如果您使用 pyproject.toml,这里是 @xtofl 解决方案的正确语法:

[tool.pylint.typecheck]
signature-mutators=['click.decorators.option',
                    'click.decorators.argument',
                    'click.decorators.version_option',
                    'click.decorators.help_option',
                    'click.decorators.pass_context',
                    'click.decorators.confirmation_option'
]
© www.soinside.com 2019 - 2024. All rights reserved.