懒人的参数解析

argz的Python项目详细描述


阿尔兹 ''/H1>

懒汉的参数解析。

核心概念

  • 简单胜过健壮
  • 脚本需要参数
  • 使用此脚本的"使用者"本身就是开发人员

用法

# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):"""    put descriptive docstring here    """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input

跑步:

$ example.py

Usage:example.py jsondict [-dbg]for detailed help, use any of (-h, /h, -?, /?, /help, --help)
$ example.py -h
|> jsondict [-dbg]||    jsondict|        adapter         |  [<built-in function open>, <function load at 0x0336B1B0>]|    dbg|        default         |  False|        adapter         |  <type 'bool'>||- - doc - -||    put descriptive docstring here|_ _ _ _ _ _

安装

下载文件或使用pip:

pip install argz

传递参数:命名vs位置

可以按名称或位置传递任何参数。 如果参数以双破折号开头,则该参数将被视为已命名,否则*将被视为位置参数。

您可以传递位置参数和命名参数的混合,因为argz将跟踪哪些参数将根据函数定义中的顺序进行解析。

*除了开关之外

文件中的参数

要将参数从文件传递到脚本,可以在其路径前面加上@。这必须是传递给脚本的第一个参数。如果有多个路由,则必须将路由名称作为第一个参数包含在文件中。

当前argz不允许文件输入和命令行输入的混合。

适配器

接受字符串参数并返回"adapted"值的可调用对象,该值稍后将传递给路由函数。

如果适配器是一个序列,则每个适配器都将被链接,以便前者的返回值被传递给后者,使用最后一个返回值作为路由函数的输入。

要中止解析过程,可能会引发任何异常。消息属性将打印给用户。

验证器

用于在进行任何调整之前验证输入。可以是以下类型之一:

  • regex string:将用于与输入匹配
  • 可调用对象:将使用输入字符串调用。任何异常或非truthy值都将中止解析过程并向用户显示消息。
  • 任何实现\u的对象都包含
deffunc(alphanum,filepath,key,novalidation):"""    put descriptive docstring here    """pass# ...f=argz.route(func)f.alphanum.validator='[a-zA-Z0-9]{2,}'f.filepath.validator=os.path.isfilef.key.validator={'option1':1,'option2':2}argz.go()

最小/最大

您可以为参数设置最小值和/或最大值:

deffunc(count):"""    put descriptive docstring here    """pass# ...f=argz.route(func)f.count.min=1# same for maxargz.go()

验证和适配器运行后,将检查这些约束。 两个值都包含在内。例如,无符号字符范围将是: min=0;max=0xff

回退与默认值

设置任何一个参数都将视为可选,但是,它们有一个主要区别:

< Buff行情>

默认值是将传递给调用的路由而不进行任何解析或验证的任何值。

< Buff行情>

fallback是一个字符串值,它将通过所有验证和分析,就像是通过命令行指定的一样。

如果参数不是通过命令行提供的,argz将使用回退默认回退值优先。

如果在函数定义中指定了默认值,argz将使用它作为参数的默认值,并在某些情况下推断默认适配器(请参见受支持的推断适配器)。

开关

具有默认布尔值的函数参数将被推断为开关。这意味着此参数也可以使用单个破折号传递,后面没有值(例如-dbg)。这样做将"切换"默认值(falsetrue,反之亦然)

上面example.py代码中的dbg参数演示了这一点。

使用拆分

设置参数的split成员会更改一些内容:

  • 将使用该字符串拆分输入
  • 如果设置,将根据列表的长度检查min\max值 瓦利将分别为列表中的每个项调用数据或分析器

瓦拉格斯和夸格斯:

如果函数接受它们,则任何附加的位置参数和命名参数将分别以varargs/kwargs形式传递。

适配器和验证器将与整个列表/字典一起调用,它们必须返回相同类型的值。

访问函数参数

设置参数属性有两种方法:

  • 姓名:
f=argz.route(func)f.myvar.min=1
  • 按索引:
f=argz.route(func)f[0].min=1
< Buff行情>

注意:参数名区分大小写

分析流

下图说明了分析参数的流程(varargs\kwargs不支持拆分输入):

 +------------+  +-----------+          +-----------+
 |  fallback  |  |   input   |          |  default  |
 +-----+------+  +-----+-----+          +-----+-----+
       |               |                      |
       +-------+-------+                      |
               |                              |
               v                              |
          +----+-----+                        |
          |  split?  |                        |
          +---+-+----+                        |
              | |                             |
              | | Yes                         |
   +----------+ v                             |
   |   +--------+--------+                    |
No |   |  min / max len  |                    |
   |   +--------+--------+                    |
   +-------+    |                             |
           |    |    +-----------+            |
           V    v    v           |            |
       +--------+----+---+       |            |
       |                 |       |            |
       |    validator    |       |            |
       |        +        |       |            |
       |        v        |       |            |
       |  adapter chain  |       |            |
       |                 |       |            |
       +--------+----+---+       |            |
                |    |           |            |
                |    | split?    |            |
                |    |           |            |
                |    +-----------+            |
       +--------+---------+                   |
       |  min / max check | (if not split)    |
       +--------+---------+                   |
                |                             |
                v                             |
        +-------+--------+                    |
        |  return value  | <------------------+
        +----------------+

使用多个路由

您可以使用argz导出多个不同的路由。 这意味着用户必须选择要运行的程序:

# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):"""    put descriptive docstring here    """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input
0

跑步:

# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):"""    put descriptive docstring here    """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input
1
# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):"""    put descriptive docstring here    """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input
2 < Buff行情>

注意:只要有多个可用的路由,就允许路由在没有参数的情况下运行。

覆盖默认值

通过将doc参数传递到route可以指定显示详细帮助时要打印的自定义文档字符串。要完全抑制它,请传递一个空字符串。

如果您使用的单个路由接受名称位于help_options中的参数,则可以在调用go时指定custom_help_options列表来替换这些参数。

测试时间

  • python 2.7.15,Windows 10
  • Python 3.7.2,Windows 10

故障排除

要启用日志记录:

# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):"""    put descriptive docstring here    """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input
3

日志级别将传递到logger.setlevel

测试

添加了一些单元测试,运行run tests.bat

许可证

麻省理工学院< /P>

待办事项

  • 允许文件输入和命令行输入的混合
  • 规范化/删除参数名中的下划线(/code>)
  • 使用route对象属性处理名称冲突
  • 根据类型注释/提示推断(PY3签名?)

查看代码:

# $ cat example.pyimportjsondeffunc(jsondict,dbg=False):"""    put descriptive docstring here    """pass# use jsondictif__name__=='__main__':importargzf=argz.route(func)f.jsondict.adapter=[open,json.load]# will be chainedargz.go()# will use sys.argv as input
4

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

推荐PyPI第三方库


热门话题
java为什么整数构造函数方法不再需要属性?   java单函数从广播接收器检索数据   Java类中的Scala设置器和获取器   JAVA MVC表选择的行ID和mysql db ID不同   java在Multimaps Guava中获取值   jakarta ee Intellij IDEA Java类在保存时不自动编译   java在另一个Spring实体中使用Spring实体   JTwitter库的安卓类一直在给我java。朗朗:温特韦尔。杰特维特。啁啾   java停止启动应用程序   java Jersey测试NoSuchMethodError   java如何处理合成元素上的注释   java崩溃shell无法通过ssh连接   java计算两个日期之间的天数后(取自edittext)如何在新的edittext中显示天数