按顺序解析参数(包括重复的参数)[.py]



我正在编写一个生成序列波形的函数,并希望让用户指定序列中每个正弦波的频率和持续时间。

我如何定义一个位置参数解析器,它可以以以下形式接受参数,这说明了每个开关传递的顺序?:

waveSequence.py --sine 440 1 --silence 0.5 --sine 110 2

(这将产生一个440Hz的正弦信号,持续1秒,然后是0.5秒的沉默,然后是110Hz的正弦信号,持续2秒)

这样的开关有可能回收吗?


解决这个问题的一种方法可能是按位置读取参数。在bash中,我可以这样做:

if [ $1 -eq 'sine' ]; then
    freq=$2
    time=$3
    shift
    shift
    shift
    # Next, continue reading from 4th argument
elif [ $1 -eq 'silence' ]; then
    # no freq, only time
    time=$2
    shift
    shift
else
    # other waveforms
fi

如何在Python中移动位置参数?

您也可以使用sys.argv作为原始参数字符串。

代码:

import sys
print sys.argv
$ python waveSequence.py—sin440 1—沉默0.5—sin110 2[' waveSequence.py ',"——正弦","440","1","——沉默","0.5","——正弦","110","2")

我相信,没有办法使位置--option参数。可能的方法是使用带有常规位置参数的关键字,例如

$ waveSequence.py sin -440-1 silence-0.5 sin -110-2
代码:

from argparse import ArgumentParser
parser = ArgumentParser(description="wave sequence generation")
parser.add_argument("waves", type=str, nargs="+")
args = parser.parse_args()
for arg in args.waves:
    (type, spec) = arg.split("-", 1)
    if type == "sine":
        (freq, duration) = spec.split("-")
        print "Playing sine wave with frequency %s for %ss" % (freq, duration)
    elif type == "silence":
        duration = spec
        print "Silence for %ss" % duration
输出:

播放频率440的正弦波,持续15秒0.5s沉默

最新更新