添加选项以单击基于检查功能的命令

click-inspect的Python项目详细描述


TestsCodecovPyPIPyPI pyversions

单击“检查”

添加基于检查函数的单击命令的选项

安装

^{}

使用

假设一个应用程序包含一个API函数,我们想为它公开一个命令行接口。该函数需要一个或两个具有内部数据类型和一组配置选项的参数。例如:

defdisplay_data(data:List[Tuple[int,int]],*,size:int,symbol:str='x',empty:str=' ')->str:"""Display the given data points in a 2D ASCII grid.    Args:        data (list of (int, int)): The data points as x- and y-tuples.        size (int): Size of the grid in both dimensions.        symbol (str): Symbol for displaying data points.        empty (str): Symbol for displaying empty space.    Returns:        str: The string containing the grid.    """grid=[[empty]*sizefor_inrange(size)]forx,yindata:grid[y][x]=symboltop=bottom=('+',*'-'*size,'+')grid=(top,*(('|',*row,'|')forrowingrid),bottom)return'\n'.join(map(''.join,grid))

这里,第一个参数的类型data,是应用程序的一个内部方面,但其余参数是泛型选项。在

现在我们要创建一个click接口,以便从命令行使用此函数。具体来说,我们希望它能处理以下格式的JSON文件:

^{pr2}$

因此,我们的命令只需要读取JSON文件,并以与display_data所期望的兼容的方式转换内容:

importjsonimportclick@click.command()@click.argument('file')defdisplay(file):withopen(file)asfh:data=json.load(fh)['data']data=[[int(x)forxinrow]forrowindata]print(display_data(data))if__name__=='__main__':display()

然后我们可以按以下方式运行程序:

$ python example.py test.json
+-----+
|     |
| x   |
|     |
|   x |
|  x  |
+-----+

现在它只使用display_data函数的默认配置,我们还希望将这些可选参数公开给命令行界面。我们可以通过添加一些选项来实现:

@click.command()@click.argument('file')@click.option('--size',default=5,help='Size of the grid in both dimensions.')@click.option('--symbol',default='x',help='Symbol for displaying data points.')@click.option('--empty',default=' ',help='Symbol for displaying empty space.')defdisplay(file,size,symbol,empty):withopen(file)asfh:data=json.load(fh)['data']data=[[int(x)forxinrow]forrowindata]print(display_data(data,size=size,symbol=symbol,empty=empty))

但这是大量的代码重复。我们复制了参数名、默认值和docstring中的帮助文本。 另外,如果我们决定向display_data添加一个新参数,我们也需要更新该命令。在

这就是click-inspect派上用场的地方。使用add_options_from修饰符,我们可以简单地将display_data中的所有可选参数添加到display命令,而无需代码重复:

fromclick_inspectimportadd_options_from@click.command()@click.argument('file')@add_options_from(display_data)defdisplay(file,**kwargs):withopen(file)asfh:data=json.load(fh)['data']data=[[int(x)forxinrow]forrowindata]print(display_data(data,**kwargs))

定制

add_options_from修饰符支持各种关键字参数,这些参数可用于 自定义从参数创建选项的方式。请参考docstring 更多信息。以下是一些可能性:

# This adds only the `size` and `empty` parameters as options:@add_options_from(display_data,include={'size','empty'})# This has a similar effect by excluding the `symbol` parameter:@add_options_from(display_data,exclude={'symbol'})# This specifies custom option-names for some of the parameters:@add_options_from(display_data,names={'size':['-s','--size'],'empty':['-e','--empty']})# This overrides the default value for the `symbol` parameter:@add_options_from(display_data,custom={'symbol':{'default':'#'}})

布尔标志

通过bool类型提示支持布尔标志。默认行为是创建on-/off选项 如click docs中所述。 如果不希望这样做,可以使用add_options_fromnames关键字参数对其进行自定义:

foo:bool=True# translates toclick.option('--foo/--no-foo',default=True)# Use the following to create an on-/off-option:add_options_from(my_func,names={'foo':['--foo']})# translates toclick.option('--foo',is_flag=True,default=True)

列表和元组

click-inspect还支持序列作为类型提示(例如list[int]或{})。 具体来说,这些类型提示的翻译如下:

foo:Sequence[int]foo:List[int]# translates toclick.option('--foo',multiple=True,type=int)# -------------------------------------------------- #foo:Tuple[int,str]# translates toclick.option('--foo',type=(int,str))

这些类型提示也支持作为docstring的一部分:

"""Args:    foo (list of int): Equivalent to List[int].    foo ((int, str)): Equivalent to Tuple[int, str]."""

活接头

click-inspect还支持typing.Union,只需选择第一个选项作为类型。 因此Union[int, str]相当于int(1) 联合也支持通过int or str作为docstring的一部分。在

Docstring样式

click-inspect支持通过^{}检查reST-styledocstrings,以及Google-和{a10}docstrings。在


(1)如果Union是泛型类型的一部分,则不能保证第一个选项与Union文本中显示的选项相同。这是因为泛型类型缓存它们的__getitem__方法。由于这个原因,List[Union[int, str]] is List[Union[str, int]]而所选类型在这两种情况下都将是int,因为这是被缓存的类型。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用jackson序列化/反序列化具有不同属性的子属性   javascript驱动程序。getTitle()从错误页面获取数据   java web应用程序的增量部署   java字符引用“&#x10”是无效的XML字符   java MyEclipse+Hibernate不按ID排序属性集?   找不到IBM Filenet P8更改预处理器Java实现   java比较器,用于按浮点参数对对象arraylist排序   java如何调试。来自eclipse或其他版本的bsh文件   不允许使用java rest api post方法   java如何在Servlet中打开弹出窗口,然后重定向页面   java的replaceAll方法对我不起作用我做错了什么?   我收到了javax。网ssl。SSLHandshakeException:握手期间远程主机关闭连接