【问题标题】:Parsing docopt argument types (any language)解析 docopt 参数类型(任何语言)
【发布时间】:2015-01-29 23:08:55
【问题描述】:

我有一个用例,用户提供一个文档字符串,并基于它生成一些代码。所以我不知道我前面的docopt字符串。

对于某些“参数类型”(不是数据类型),我希望生成各种代码。

下面,我将区分“类型”和“数据类型”。对于docopt参数--arg=DEGREES和argv输入--arg=10--arg的“类型”是DEGREES,而数据类型是integer。值为10

用户可以给我以下文档字符串:

Naval Fate.

Usage:
  naval_fate --dir=FILE [--speed=ABC]

Options:
  --dir=FILE   Moored (anchored) mine.
  --speed=ABC  Speed in knots [default: 10].

除了像往常一样解析这个docopt字符串之外,我还试图弄清楚dirspeed要求的参数“类型”是什么。我想知道dir 的类型是FILEspeed 的类型是ABC

示例:

鉴于上面的docopt字符串和一个argv字符串naval_fate --dir=/tmp --speed 1234,我希望不仅可以访问值和数据类型(<key> => <value,datatype>),还可以访问“配置类型”(<key> => <value,datatype,argtype>,即类似的东西的:

dir => 值:/tmp,数据类型:String类型:FILE
speed => 值:1234,数据类型:@987654344 @, 输入:ABC

docopt 的任何(托管)实现都是可以接受的,包括 Python 的,尽管我最好在编译语言中寻找解决方案,无论是 C、Go、Rust 等。

【问题讨论】:

  • 你能添加更多你想要的例子吗?看来我可能误解了你的问题。
  • 抱歉含糊不清。我已经编辑了我的问题,希望现在更清楚。
  • 整洁的请求。 Rust 的 Docopt 确实将这些信息放在了地板上。不幸的是,我不知道是否有其他 Docopt 解析器可以使用它。我打开了一个新功能请求:github.com/docopt/docopt.rs/issues/88
  • 干杯。我不相信向任何 docopt 解析器添加“非标准”功能是正确的方法,因为目标必须是让所有 docopt 解析器表现相同?也许某种允许用户遍历/检查解析的docopt文档的功能是正确的方法?无论如何,这可能是最好留给功能请求的讨论。
  • 啊,没想到你是 rust docopt 库的作者。感谢您的出色工作 - 这是一个整洁的图书馆 :)

标签: python go rust docopt


【解决方案1】:

Rust's Docopt 很容易做到这一点:

#![allow(unstable)]

extern crate docopt;

use docopt::Docopt;

static USAGE: &'static str = "
Naval Fate.

Usage:
    naval_fate ship --dir=FILE [--speed <kn>]
    naval_fate (-h | --help)

Options:
    -h --help     Show this screen.
    --speed <kn>  Speed in knots [default: 10].
    --dir=FILE    Moored (anchored) mine.
";

fn main() {
    let args = Docopt::new(USAGE)
                      .and_then(|d| d.parse())
                      .unwrap_or_else(|e| e.exit());
    println!("Type of 'ship': {:?}", args.find("ship"));
    println!("Type of '--dir': {:?}", args.find("--dir"));
    println!("Type of '--speed': {:?}", args.find("--speed"));
}

哪些输出:

$ ./target/scratch ship --dir /tmp --speed 1234                                        
Type of 'ship': Some(Switch(true))                                                                       
Type of '--dir': Some(Plain(Some("/tmp")))                                                               
Type of '--speed': Some(Plain(Some("1234"))) 

关键是find的返回类型是Value,是代数数据类型:http://burntsushi.net/rustdoc/docopt/enum.Value.html---所以通过构造,你可以免费得到参数的“类型”。

请注意,这适用于 Docopt 用法字符串中的任何“参数”,即使它没有传递到参数列表中。

【讨论】:

  • 也许我误解了这个问题? OP 只想要参数的字符串?
  • 是的,我想我们的意思是一样的。我确实在寻找确定选项是 DIR 和 FILE。对于未来的读者:请注意,我已经简化了原始示例,因此为什么 BurntSushi5 的示例与问题没有 100% 对应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
相关资源
最近更新 更多