您可以尝试使用 nessaid-cli 包对 CLI 令牌进行额外验证。可以使用支持复杂 CLI 选项和组合的丰富语法来指定 CLI。 CLI 可以作为交互式 shell 或独立脚本运行。
该框架可在pypi 和github 获得
问题中的基本CLI可以这样实现
import sys
import asyncio
from nessaid_cli.cmd import NessaidCmd
from nessaid_cli.tokens import StringToken;
class TestCli(NessaidCmd):
r"""
token OPTION1 StringToken(), OPTION2 StringToken();
"""
def get_token_classes(self):
"""Method to override.
It should return the list of token classes being used"""
return [StringToken]
def do_command1(self, option1, option2):
r"""
"--option1"
OPTION1
"--option2"
OPTION2
<<
$option1 = $2;
$option2 = $4;
>>
"""
print(f"option1={option1} option2={option2}")
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(TestCli.execute_args(*sys.argv[1:]))
这将不接受 pgm.py --option1 --option2 val2,因为我们强制要求所有 4 个 CLI 令牌。
这是输出
C:\Users\Said\Desktop>python clitest.py --option1 A --option2 B
option1=A option2=B
C:\Users\Said\Desktop>python clitest.py --option1 1 --option2 2
option1=1 option2=2
C:\Users\Said\Desktop>python clitest.py --option1 --option1 --option2 2
option1=--option1 option2=2
C:\Users\Said\Desktop>python clitest.py --option1 --option2 --option2 --option1
option1=--option2 option2=--option1
现在下面的pass因为我们有自动完成并且上面CLI中关键字的位置是固定的
C:\Users\Said\Desktop>python clitest.py --option --option2 --opt --option1
option1=--option2 option2=--option1
以下失败,因为它需要 --option2 作为第三个参数
C:\Users\Said\Desktop>python clitest.py --option --option2 option2 2
Result: failure
Error: Could not match any rule for this sequence
以下失败,因为缺少第四个参数。
C:\Users\Said\Desktop>python clitest.py --option --option2 --option2
Result: partial
Error: Input sequence is not complete
下一个示例展示了我们如何定义自定义标记。在此,我们可以验证令牌。在这里,我们阻止“--option1”和“--option2”作为输入值。
import sys
import asyncio
from nessaid_cli.cmd import NessaidCmd
from nessaid_cli.tokens import StringToken, MATCH_FAILURE, MATCH_SUCCESS;
class ValidOptions(StringToken):
def match(self, token_input):
if token_input in ["--option1", "--option2"]:
return MATCH_FAILURE
return MATCH_SUCCESS
class TestCli(NessaidCmd):
r"""
token OPTION1 ValidOptions(), OPTION2 ValidOptions();
"""
def get_token_classes(self):
"""Method to override.
It should return the list of token classes being used"""
return [ValidOptions]
def do_command1(self, option1, option2):
r"""
"--option1"
OPTION1
"--option2"
OPTION2
<<
$option1 = $2;
$option2 = $4;
>>
"""
print(f"option1={option1} option2={option2}")
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(TestCli.execute_args(*sys.argv[1:]))
然后行为就变成这样了
C:\Users\Said\Desktop>python clitest.py --op 1 --op 2
option1=1 option2=2
C:\Users\Said\Desktop>python clitest.py --op --option1 --op 2
Result: failure
Error: Could not match any rule for this sequence
C:\Users\Said\Desktop>python clitest.py --op option1 --op 2
option1=option1 option2=2
C:\Users\Said\Desktop>python clitest.py --op option1 --op --option2
Result: failure
Error: Could not match any rule for this sequence
C:\Users\Said\Desktop>python clitest.py --op option1 --op --option3
option1=option1 option2=--option3