首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在单击选项中使用python-click参数(检查文件中是否存在变量)?

如何在单击选项中使用python-click参数(检查文件中是否存在变量)?
EN

Stack Overflow用户
提问于 2017-10-05 13:26:05
回答 1查看 3.4K关注 0票数 3

我希望传递一个文件(netCDF数据文件)作为第一个参数,并传递一个选项(-v)来指示要从该文件读取的变量到我的脚本。

我想我需要一个自定义回调来评估该变量或这些变量是否包含在文件中。但是,我想不出如何在回调方法中访问这个参数。

代码语言:javascript
复制
import click
import xarray as xr

def validate_variable(ctx, param, value):
    """Check that requested variable(s) are in netCDF file """

    # HOW TO ACCESS ARGUMENT 'tile' ???

    with xr.open_dataset(ctx.tile) as ds:
        for v in value:
            if v not in ds.data_vars:
                raise click.BadParameter('Var %s not in file %s.' % (v, ctx.tile))

EPILOG = 'my script ...'

CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])

@click.command(context_settings=CONTEXT_SETTINGS, epilog=EPILOG)

@click.pass_context
@click.option('--variable', '-v', multiple=True, metavar='VAR', 
                callback=validate_variable,
                help='variable to render')
@click.argument('tile', type=click.File())
def cli(tile, variable):
    main(tile, variable)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-05 15:48:04

您在回调中尝试执行此操作时遇到了问题,因为调用回调的顺序不能保证在调用回调时,您需要的所有参数都已被计算过。

可以这样做的一种方法是覆盖click.Command.make_context(),并在上下文构造完成后进行验证。

自定义命令类

此函数被传递给一个验证器函数,并返回一个自定义click.Command类。

代码语言:javascript
复制
def command_validate(validator):

    class CustomClass(click.Command):

        def make_context(self, *args, **kwargs):
            ctx = super(CustomClass, self).make_context(*args, **kwargs)
            validator(ctx)
            return ctx

    return CustomClass

验证器函数

验证器函数将传递一个上下文,并在验证失败时引发click.BadParameter异常。

代码语言:javascript
复制
def validate_variables(ctx):
    """Check that requested variable(s) are in netCDF file """

    value = ctx.params['variable']
    tile = ctx.params['tile']
    with xr.open_dataset(tile) as ds:
        for v in value:
            if v not in ds.data_vars:
                raise click.BadParameter(
                    'Var %s not in file %s.' % (v, tile), ctx)

使用自定义类:

要使用自定义类,向command_validate传递一个验证器函数,并将返回值作为cls传递给命令装饰器,如下所示:

代码语言:javascript
复制
@click.command(cls=command_validate(validate_variables), ...OtherOptions...)
...Other config...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46586831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档