Python argparse:多个可选位置参数之间的依赖关系

Python argparse:多个可选位置参数之间的依赖关系,python,python-3.x,command-line-arguments,argparse,Python,Python 3.x,Command Line Arguments,Argparse,我正在寻找一种使用python3中的argparse模块解析以下命令行语法的方法: myapp.py [folder] [[from] to] 含义:用户可以选择定义一个文件夹,默认为cwd。此外,用户最多可以传递两个整数。如果只给出一个数字,则应将其存储在to变量中。这类似于python内置的range()的语法 e、 g: 可能吗?如果是,如何使用?使用选项;这就是他们的目的(而且argparse擅长解析) 因此,语法如下 myapp.py [-F folder] [[from] to]

我正在寻找一种使用python3中的argparse模块解析以下命令行语法的方法:

myapp.py [folder] [[from] to]
含义:用户可以选择定义一个文件夹,默认为cwd。此外,用户最多可以传递两个整数。如果只给出一个数字,则应将其存储在
to
变量中。这类似于python内置的
range()
的语法

e、 g:


可能吗?如果是,如何使用?

使用选项;这就是他们的目的(而且
argparse
擅长解析)

因此,语法如下

myapp.py [-F folder] [[from] to]

将更有意义,并且更容易解析。

使用选项;这就是他们的目的(而且
argparse
擅长解析)

因此,语法如下

myapp.py [-F folder] [[from] to]

将更有意义,并且更容易解析。

您可以做一些非常愚蠢的事情:

import argparse
import os

class MyAction(argparse.Action):
    def __call__(self,parser,namespace,values,option_string=None):
        namespace.numbers = []
        namespace.path = os.getcwd()
        for v in values:
            if os.path.isdir(v):
                namespace.path = v
            else:
                try:
                    namespace.numbers.append(int(v))
                    if len(namespace.numbers) > 2
                       parser.error("Barg2!!!")
                except ValueError:
                    parser.error("Barg!!!")

p = argparse.ArgumentParser()
p.add_argument('stuff',nargs='*',action=MyAction)
n = p.parse_args()
print n

但是,如果你要这样做,你也可以只处理代码> sys .ARGV 自己——你真的应该考虑在这里使用实际选项…

你可以做一些相当愚蠢的事情:

import argparse
import os

class MyAction(argparse.Action):
    def __call__(self,parser,namespace,values,option_string=None):
        namespace.numbers = []
        namespace.path = os.getcwd()
        for v in values:
            if os.path.isdir(v):
                namespace.path = v
            else:
                try:
                    namespace.numbers.append(int(v))
                    if len(namespace.numbers) > 2
                       parser.error("Barg2!!!")
                except ValueError:
                    parser.error("Barg!!!")

p = argparse.ArgumentParser()
p.add_argument('stuff',nargs='*',action=MyAction)
n = p.parse_args()
print n

但是如果你要这么做,你也可以只处理代码> sys .ARGV 自己——你真的应该考虑在这里使用实际选项…

< P>我也建议你自己分析语法。
FWIW,我甚至在argparse或类似的项目上解析sys.argv,因为自己解析sys.argv可以很好地与pylint或flake8配合使用。

我还建议自己解析sys.argv


FWIW,即使在argparse或类似的项目上,我也会解析sys.argv,因为解析sys.argv本身可以很好地处理pylint或flake8。

如果不使用文件夹的命名参数,我看不到一种方法:

# usage: argparsetest2.py [-h] [--folder [FOLDER]] [to] [fr]

import argparse
import os

parser = argparse.ArgumentParser()
parser.add_argument('--folder', dest='folder', nargs='?', default=os.getcwd())
parser.add_argument('to', type=int, nargs='?')
parser.add_argument('fr', type=int, nargs='?')
args = parser.parse_args()

print args

如果不使用文件夹的命名参数,我无法找到执行此操作的方法:

# usage: argparsetest2.py [-h] [--folder [FOLDER]] [to] [fr]

import argparse
import os

parser = argparse.ArgumentParser()
parser.add_argument('--folder', dest='folder', nargs='?', default=os.getcwd())
parser.add_argument('to', type=int, nargs='?')
parser.add_argument('fr', type=int, nargs='?')
args = parser.parse_args()

print args

argparse应该如何区分
myapp文件夹
myapp 10
?在我看来,除了对返回的名称空间进行后期处理之外,您别无选择——此时,您最好只处理
sys.argv
argparse应该如何区分
myapp folder
myapp 10
?在我看来,除了对返回的名称空间进行后期处理之外,您别无选择——在这一点上,您最好只处理
sys.argv
,这将是
[to][from]
,而不是
[[from]to]
@FabianHenze。我认为这是获得所需位置行为的唯一方法。如果颠倒顺序,则会将单个整数指定给“from”而不是“to”。唯一的另一个选项(对于
argparse
)是使用所有命名参数,例如
myapp.py--folder--from--to
,它将是
[to][from]
,而不是
[from]to]
@FabianHenze。我认为这是获得所需位置行为的唯一方法。如果颠倒顺序,则会将单个整数指定给“from”而不是“to”。唯一的其他选项(对于
argparse
无论如何)是使用所有命名参数,例如
myapp.py--folder--from--to
holy sh**。。。真棒的答案,但我会按照你的
sys.argv
advicesh**。。。回答得真棒,但我会听从你的
sys.argv
建议