这是一个使用 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 的方法?
@click.command
装饰器编辑你的函数参数,但 pylint 不知道这一点,因为它实际上并不运行你的代码。
我认为为了让 pylint 高兴而让你的代码变得奇怪是没有意义的。相反,请忽略它,或添加注释以在当前范围内禁用该警告:
# pylint: disable=no-value-for-parameter
同时,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)
有一种方法可以避免这些错误的发生,即不使用装饰语法。这可能就是 @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()
好与不好还有待商榷:-)
@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的解决方案,我会得到“建议的编辑队列已满”。
如果您使用 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'
]