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

发布于 2025-01-11 08:53:19 字数 1027 浏览 1 评论 0原文

Python 的 click 模块有 choice-options,当输入无效时:

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

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

Python's click module have choice-options, when the input is invalid:

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()

the script above will exit when the user input invalid choice, and it print out the valid choices for you, which is convenient.

I try to rewrite it in Raku:

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

When offter an invalid choice, Raku just output the Usage, which is less awesome:

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

So, How to get better error prompt if the input value from command line not in a list of valide choice in the MAIN routine?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

请别遗忘我 2025-01-18 08:53:19
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
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
表情可笑 2025-01-18 08:53:19

通过使 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 hide-from-USAGE 因为我们不想看到它任何 USAGE 消息中列出的候选人。另请注意,通过指定 !,第二个 MAIN 候选者将 hash_type 参数作为强制参数。

如果您有更多候选者,您可能需要处理第二个候选者中的任何其他命名参数。

编辑:wamba 的答案更好。仍然将我的答案留在这里,因为它可能会向人们介绍使用 multi sub 进行 MAIN 以及使用 ishidden-from-USAGE 的概念代码>特征。

By making MAIN a multi sub:

# 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";
}

Note that the second MAIN candidate has is hidden-from-USAGE because we don't want to see that candidate listed in any USAGE message. Also note that the second MAIN candidate has the hash_type argument as mandatory, by specifying the !.

If you have more candidates, you will probably need to take care of any additional named arguments in the second candidate.

EDIT: wamba's answer is better. Still leaving my answer here as it may introduce people to the concept of using multi subs for MAIN, and of using the is hidden-from-USAGE trait.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文