如果命令行的输入值不在MAIN例程的有效值选择列表中,如何获得更好的错误提示



Python的点击模块有选项,当输入无效时:

import click
@click.command()
@click.option('--hash-type',
type=click.Choice(['MD5', 'SHA1'], case_sensitive=False))
def digest(hash_type):
click.echo(hash_type)
# python demo.py --hash-type=HASH256
# Error: Invalid value for '--hash-type': 'HASH256' is not one of 'MD5', 'SHA1'.
if __name__=="__main__":
digest()

当用户输入无效选项时,上面的脚本将退出,并为您打印出有效的选项,这很方便。

我试图在Raku:中重写它

# raku demo.raku --hash_type=HASH256
sub MAIN(
:$hash_type where * ∈ ['MD5', 'SHA1'], #= the hash code
) {
say $hash_type;
}

当选择无效时,Raku只输出用法,这就不那么可怕了:

Usage:
demo.raku [--hash_type[=Any where { ... }]]
--hash_type[=Any where { ... }]    the hash code

那么,如果命令行的输入值不在MAIN例程的有效值选择列表中,如何获得更好的错误提示?

enum HT <MD5 SHA1>; 
sub MAIN(
HT :$hash_type!,
) {
say $hash_type;
}
Usage:
-e '...' [--hash_type=<HT> (MD5 SHA1)]

--hash_type=<HT> (MD5 SHA1)    the hash code

通过使MAIN成为多个子:

# raku demo.raku --hash_type=HASH256
multi sub MAIN(
:$hash_type where * ∈ <MD5 SHA1>, #= the hash code
) {
say "OK: $hash_type";
}
multi sub MAIN(:$hash_type!) is hidden-from-USAGE {
say "Unrecognized hash_type: $hash_type";
}

请注意,第二个MAIN候选者具有is hidden-from-USAGE,因为我们不希望看到该候选者在任何USAGE消息中列出。还要注意,通过指定!,第二个MAIN候选者具有强制性的hash_type参数。

如果你有更多的候选人,你可能需要在第二个候选人中处理任何额外的命名论点。

编辑:万巴的答案更好。我的答案仍然保留在这里,因为它可能会向人们介绍使用multi sub来代替MAIN和使用is hidden-from-USAGE特性的概念。

最新更新