gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:30 24 4
gpt4 key购买 nike

我想传递一个文件(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)

最佳答案

尝试在回调中执行此操作时会遇到问题,因为调用回调的顺序并不能保证在调用回调时会评估您需要的所有参数。

实现此目的的一种方法是重写 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...

关于python - 如何在单击选项中使用 python-click 参数(检查文件中是否存在变量)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46586831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com