为编写面向行的命令解释器提供简单框架的类称为 cmd 类。这些通常对于稍后将被包装在更复杂的接口中的管理工具、原型和测试工具很有用。使用 cmd 模块可以轻松创建命令行接口。
如今,图形用户接口的使用如此之多,以至于命令行解释器似乎已经过时了。命令行接口有几个优点:
- 命令行接口是可移植的并且可以在任何地方运行。
- CPU和内存资源比GUI接口便宜得多。
- 使用命令行打开文件比进入驱动程序并搜索菜单更容易。
- 创建面向文本的文档要快得多。
命令类
该模块只定义了一个类:Cmd 类。命令行解释器创建sub-classing cmd.Cmd 类。 Cmd 实例或子类实例可以被视为面向行的解释器框架。
- 创建命令:在解释器提示符下输入的一行文本的第一部分是命令。 identchars 成员中包含的最长字符串是 Command。
非重音字母、数字和下划线符号是默认的 identchars。该行的末尾是命令的参数。 - 参数:do_xxx 方法只应采用一个额外参数,该参数对应于用户在命令名称后输入的字符串部分。
- Errors:解释器使用以下格式来表示错误:
*** :
- 返回值:在最常见的情况下:命令不应返回值。当您想要退出解释器循环时,任何返回真值的命令都会停止解释器,这是一个例外。
Example:
Python3
def add(self, d):
k = d.split()
if len(k)!= 2:
print "*** invalid number of arguments"
return
try:
k = [int(i) for i in k]
except ValueError:
print "*** arguments should be numbers"
return
print k[0]+k[1]
命令解析模块
cmdparser 包包含两个可用于编写文本命令解析器的模块。
该模块特别使用内置的Python cmd 模块。该软件包由两个模块组成:
- cmdparser.cmdparser
- cmdparser.datetimeparse
安装
我们可以从 PyPI 安装 cmdparse 包。例如
pip install cmdparse
cmdparse 概述
Cmd 模块允许从文本命令规范创建解析树,如下所示
chips( spam | ham [eggs] | beans [eggs [...]] )
可以使用这些解析树检查特定的命令字符串。此外,它还允许列出部分命令字符串的有效完成。
例子:
Python3
from cmdparser import cmdparser
parse_tree = cmdparser.parse_spec("abc (def|ghi) <jkl> [mno]")
# Returns None to indicate
# successful parse
parse_tree.check_match(("abc", "def", "anything"))
# Returns an appropriate
# parsing error message
parse_tree.check_match(("abc", "ghi", "anything", "pqr"))
# Returns the list ["def", "ghi"]
parse_tree.get_completions(("abc", ))
输出:
可以设置动态令牌,其中接受的字符串列表可以随时间变化,或者在处理固定令牌字符串时可以接受任意字符串或字符串列表。检查模块的文档字符串以了解可用类的具体信息,例如:
Python3
from cmdparser import cmdparser
class fruitToken(cmdparser.Token):
def get_values(self, context):
# Static list here, but could
# easily be dynamic
return ["raspberry", "orange", "mango",
"grapes", "apple", "banana"]
def my_ident_factory(token):
if token == "number":
return cmdparser.IntegerToken(token)
elif token == "fruit":
return fruitToken(token)
return None
parse_tree = cmdparser.parse_tree("take <number> <fruit> bags",
ident_factory = my_ident_factory)
# Returns None to indicate successful
# parse, and the "cmd_fields" dict will
# be initialised as:
# { "take": ["take"], "<number>": ["23"],
# "<fruit>": ["apple"], "bags": ["bags"] }
cmd_fields = {}
parse_tree.check_match(("take", "23",
"apple", "bags"),
fields = cmd_fields)
# Returns an appropriate
# parsing error message
parse_tree.check_match(("take", "all",
"raspberry", "bags"))
# Returns the list ["raspberry",
# "orange", "mango", ..., "banana"]
parse_tree.get_completions(("take", "5"))
输出:
有四个类可用,它们是用户派生令牌的合适基类:
- Token:当一组固定值合适时,这是有用的,其中列表可以是固定的或动态的。应重写 get_values() 方法以将有效标记列表作为字符串返回。
- Anytoken:它与 Token 类似,但可以是任何字符串。可以通过 validate() 方法执行验证,但 validate() 方法不允许制表符完成,因为只有在解析整个命令后才会调用它。如果需要的话,还有一个convert()方法
- AnyTokenString:与 AnyToken 类似,但命令行上的所有剩余项目都会被消耗。
- Subtree:它匹配整个命令子树,并将结果存储在字段字典中的指定标记上。命令规范字符串应传递给构造函数,类型类将重写 convert() 方法并以某种方式解释命令(尽管这是严格可选的)。
装饰器可与从 cmd.Cmd 派生的命令处理程序一起使用,它允许从文档字符串帮助文本中自动提取命令字符串,并允许将命令解析和完成添加到类的命令处理方法中。
实现do_XXX() 形式的各种方法来实现 cmd.Cmd 类。
Python3
from cmdparser import cmdparser
@cmdparser.CmdClassDecorator()
class CommandHandler(cmd.Cmd):
@cmdparser.CmdMethodDecorator():
def do_command(self, args, fields):
"""command ( add | delete ) <name>
The example explains the use of
command to demonstrate use of the cmd
decorators.
"""
# Method body - it will only be called
# if a command parses successfully according
# to the specification above.
日期时间解析概述
- Datetimeparse 模块添加了特定的标记类型来解析人类可读的日期和时间规范。指定绝对日期和相对日期这两种类型,并根据需要将其转换为其他实例。
一些例子是
1:35 on friday last week 11 feb 2019
- 当前定义的类有:
- DateSubtree:它包括文字日期 (2020-03-14)、与当天相关的星期几(上周星期六)、说明性版本(2019 年 6 月 26 日)以及昨天、今天和明天以及解析日历日期。返回值是datetime.date实例。
- TimeSubtree:12 或 24 小时格式的时间由 TimeSubtree 解析。返回值是time.localtime()返回的值。
- RelativeTimeSubtree:返回的值是 cmdparser.DateDelta 的实例,它是包含 datetime.timedelta 的包装类。它解析指示与当前时间的时间偏移的短语,例如 3 天前和 2 小时前。
- DateTimeSubtree:datetime.datetime 实例是返回值。DateTimeSubtree 解析日期和时间的规范,接受 DateSubtree 和 TimeSubtree 短语的组合,或 RelativeTimeSubtree 短语;在后一种情况下,时间是相对于当前时间而言的。
- CLassCalenderPeriodSubtree:解析过去日历周期的规范。返回的值是 datetime.date 实例的 2 元组,表示指定的日期范围,其中第一个日期包含在内,第二个日期不包含在内。
- DateSubtree:它包括文字日期 (2020-03-14)、与当天相关的星期几(上周星期六)、说明性版本(2019 年 6 月 26 日)以及昨天、今天和明天以及解析日历日期。返回值是datetime.date实例。
相关用法
- Python Calendar itermonthdates()用法及代码示例
- Python Calendar itermonthdays()用法及代码示例
- Python Calendar itermonthdays2()用法及代码示例
- Python Calendar itermonthdays3()用法及代码示例
- Python Calendar itermonthdays4()用法及代码示例
- Python Calendar iterweekdays()用法及代码示例
- Python Calendar monthdatescalendar()用法及代码示例
- Python Calendar monthdays2calendar()用法及代码示例
- Python Calendar monthdayscalendar()用法及代码示例
- Python Calendar yeardatescalendar()用法及代码示例
- Python Calendar yeardays2calendar()用法及代码示例
- Python Calendar yeardayscalendar()用法及代码示例
- Python Condition acquire()用法及代码示例
- Python Condition notify()用法及代码示例
- Python Condition notify_all()用法及代码示例
- Python Condition release()用法及代码示例
- Python Condition wait()用法及代码示例
- Python Collections.UserList用法及代码示例
- Python Collections.UserDict用法及代码示例
- Python Collections.UserString用法及代码示例
- Python Celsius转Fahrenheit用法及代码示例
- Python CSV转JSON用法及代码示例
- Python CSV File转PDF File用法及代码示例
- Python Complex Number转String用法及代码示例
- Python Coordinate Dictionary转Matrix用法及代码示例
注:本文由纯净天空筛选整理自shivalibhadaniya大神的英文原创作品 Cmdparse module in Python。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。