接收检查插件的信息

插件到 Flake8 他们可以从 FileProcessor 实例。历史上, Flake8 支持两种类型的插件:

  1. 接受解析的抽象语法树(AST)的类

  2. 接受一系列参数的函数

Flake8 现在不区分这两种类型的插件。任何插件都可以接受AST或一系列参数。此外,任何具有特定可调用属性的插件也可以注册选项并接收解析的选项。

指示所需数据

Flake8 使用插件参数来确定它期望什么 flake8.utils.parameters_for() . flake8.plugins.manager.Plugin.parameters 缓存这些值,以便每个插件对每个插件进行一次相当昂贵的调用。在处理文件时,插件可以请求以下任何一项:

有些属性是为插件在数据上迭代而不是在每一条物理或逻辑行上被调用的每个文件设置一次。

这些参数也可以分别提供给在每一行上工作的插件。

依赖于 physical_linelogical_line 在每个物理或逻辑行上运行一次。这些参数应该是参数列表中的第一个参数(除了 self ). 需要AST的插件(例如PyFlakes和McCabe)应该依赖于 tree . 这些插件将每个文件运行一次。上面列出的参数可以与 physical_linelogical_linetree .

注册选项

任何具有可调用属性的插件 add_optionsparse_options 可以解析选项信息并注册新选项。

你的 add_options 函数应预期接收 OptionManager . 安 OptionManager 实例的行为与 optparse.OptionParser . 但是,它使用的层 Flake8 已经在 argparse 同时处理配置文件解析。 add_option() 创建一个 Option 它接受与相同的参数 optparse 以及三个额外的布尔参数:

  • parse_from_config

    命令行选项也应该从 Flake8 .

    注解

    它代替了将字符串附加到 optparse.OptionParser .

  • comma_separated_list

    提供给此选项的值是逗号分隔的列表。在分析了该值之后,应该将其进一步分解为一个列表。这也允许我们处理如下值:

    E123,E124,
    E125,
      E126
    
  • normalize_paths

    提供给此选项的值是路径。它应该规范化为绝对路径。这可以与 comma_separated_list 允许以逗号分隔的路径列表。

每个选项都可以单独工作,也可以组合使用。让我们看看 Flake8 . 在每个例子中,我们都有 option_manager 这是 OptionManager .

option_manager.add_option(
    '--max-line-length', type='int', metavar='n',
    default=defaults.MAX_LINE_LENGTH, parse_from_config=True,
    help='Maximum allowed line length for the entirety of this run. '
         '(Default: %(default)s)',
)

我们在这里添加 --max-line-length 命令行选项,它始终是一个整数,将从配置文件中解析。既然我们提供了违约,我们就利用 argparse 愿意在帮助文本中显示 %(default)s .

option_manager.add_option(
    '--select', metavar='errors', default='',
    parse_from_config=True, comma_separated_list=True,
    help='Comma-separated list of errors and warnings to enable.'
         ' For example, ``--select=E4,E51,W234``. (Default: %(default)s)',
)

在添加 --select 命令行选项,我们还向 OptionManager 我们希望从配置文件中解析该值,并将其解析为逗号分隔的列表。

option_manager.add_option(
    '--exclude', metavar='patterns', default=defaults.EXCLUDE,
    comma_separated_list=True, parse_from_config=True,
    normalize_paths=True,
    help='Comma-separated list of files or directories to exclude.'
         '(Default: %(default)s)',
)

最后,我们展示了一个使用所有三个额外标志的选项。值来自 --exclude 将从配置解析,从逗号分隔的列表转换,然后每个项都将被规范化。

有关其他参数的信息 add_option() 请参阅 argparse .

访问解析的选项

当一个插件有一个可调用的 parse_options 属性, Flake8 将调用它并尝试提供 OptionManager 实例,解析的选项将是 argparse.Namespace ,以及 OptionManager . 如果失败了,我们就通过考试 argparse.Namespace . 换句话说,你的 parse_options callable将具有以下签名之一:

def parse_options(option_manager, options, args):
    pass
# or
def parse_options(options):
    pass