我有一个用例,其中用户提供了一个 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> ,即类似以下内容的内容:
docopt 的任何(托管)实现都是可以接受的,包括 Python 的,但我最好是在寻找编译语言的解决方案,无论是 C、Go、Rust 等。dir => 值:/tmp ,数据类型:String , 类型:FILE
speed => 值:1234 ,数据类型:Integer , 类型:ABC
最佳答案
使用 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 用法字符串中的任何“参数”,即使它没有传递到参数列表中也是如此。
关于python - 解析 docopt 参数类型(任何语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28210260/
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)