我有一个用例,用户提供一个docopt字符串,并在此基础上生成一些代码。所以我不知道我前面的docopt字符串。
对于某些“参数类型”(不是数据类型),我希望生成各种代码。
在下面,我将区分“类型”和“数据类型”。对于docopt参数--arg=DEGREES和argv输入--arg=10,--arg的“类型”为DEGREES,而数据类型为integer。值为10。
用户可能会给我以下docopt字符串:
Naval Fate.
Usage:
naval_fate --dir=FILE [--speed=ABC]
Options:
--dir=FILE Moored (anchored) mine.
--speed=ABC Speed in knots [default: 10].除了像往常一样解析这个docopt字符串之外,我还试图找出参数dir和speed所要求的“类型”。我想知道dir是FILE类型,speed是ABC类型。
示例:
鉴于上述docopt字符串和argv字符串naval_fate --dir=/tmp --speed 1234,我希望不仅访问值和数据类型(<key> => <value,datatype>),而且访问“配置类型”(<key> => <value,datatype,argtype>,即类似于以下内容的内容):
FILE dir => val:/tmp,数据类型:String,类型:
ABC speed => val:1234,数据类型:Integer,类型:
docopt的任何(托管)实现都是可以接受的,包括Python的实现,不过最好是用编译语言寻找解决方案,不管是C、Go、Rust等等。
发布于 2015-01-29 12:15:38
对于铁锈主义来说,这很容易
#![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使用字符串中的任何“参数”,即使它没有传递到参数列表中。
https://stackoverflow.com/questions/28210260
复制相似问题