我希望传递一个文件(netCDF数据文件)作为第一个参数,并传递一个选项(-v)来指示要从该文件读取的变量到我的脚本。
我想我需要一个自定义回调来评估该变量或这些变量是否包含在文件中。但是,我想不出如何在回调方法中访问这个参数。
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)发布于 2017-10-05 15:48:04
您在回调中尝试执行此操作时遇到了问题,因为调用回调的顺序不能保证在调用回调时,您需要的所有参数都已被计算过。
可以这样做的一种方法是覆盖click.Command.make_context(),并在上下文构造完成后进行验证。
自定义命令类
此函数被传递给一个验证器函数,并返回一个自定义click.Command类。
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异常。
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传递给命令装饰器,如下所示:
@click.command(cls=command_validate(validate_variables), ...OtherOptions...)
...Other config...https://stackoverflow.com/questions/46586831
复制相似问题