Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果未传递任何命令行参数,则为Python默认参数_Python_Argparse - Fatal编程技术网

如果未传递任何命令行参数,则为Python默认参数

如果未传递任何命令行参数,则为Python默认参数,python,argparse,Python,Argparse,我想建立一个具有这种行为的程序: 用法:sage 4ct.py[-h](-rr-i-p)[-o] 但是如果您不提供任何参数,我希望使用“-r 100”作为默认值 可能吗 parser = argparse.ArgumentParser(description = '4ct args') group_input = parser.add_mutually_exclusive_group(required = True) group_input.add_argument("-r", "-rando

我想建立一个具有这种行为的程序:

用法:sage 4ct.py[-h](-rr-i-p)[-o]

但是如果您不提供任何参数,我希望使用“-r 100”作为默认值

可能吗

parser = argparse.ArgumentParser(description = '4ct args')

group_input = parser.add_mutually_exclusive_group(required = True)
group_input.add_argument("-r", "-random", help = "Random graph: dual of a triangulation of N vertices", nargs = 1, type = int, default = 100)
group_input.add_argument("-i", "-input", help = "Input edgelist filename (networkx)", nargs = 1)
group_input.add_argument("-p", "-planar", help = "Load a planar embedding of the graph G.faces() - Automatically saved at each run: input_planar_file.serialized", nargs = 1)
parser.add_argument("-o", "-output", help="Output edgelist filename (networkx)", nargs = 1, required = False)

args = parser.parse_args()

尝试以下方法:

import argparse
import sys

parser = argparse.ArgumentParser(description='4ct args')

group_input = parser.add_mutually_exclusive_group(required=True)
group_input.add_argument("-r", "-random", help="Random graph: dual of a triangulation of N vertices", nargs=1, type=int,             default=100)
group_input.add_argument("-i", "-input", help="Input edgelist filename (networkx)", nargs=1)
group_input.add_argument("-p", "-planar", help="Load a planar embedding of the graph G.faces() - Automatically saved at each run: input_planar_file.serialized",nargs=1)
parser.add_argument("-o", "-output", help="Output edgelist filename (networkx)", nargs=1, required=False)

if not sys.argv[1:]:
    sys.argv.extend(['-r', '100'])

args = parser.parse_args(sys.argv[1:])

基本上,您正在检查是否给出了任何命令行参数,如果没有,则添加所需的
-r 100
只需删除
添加互斥组
函数调用的
必需
参数(或将其设置为False),即可完成以下操作:

import argparse

parser = argparse.ArgumentParser(description = '4ct args')

group_input = parser.add_mutually_exclusive_group(required = False)
group_input.add_argument("-r", "--random", help = "Random graph: dual of a triangulation of N vertices", type = int, default = 100)
group_input.add_argument("-i", "--input", help = "Input edgelist filename (networkx)")
group_input.add_argument("-p", "--planar", help = "Load a planar embedding of the graph G.faces() - Automatically saved at each run: input_planar_file.serialized")
parser.add_argument("-o", "--output", help="Output edgelist filename (networkx)", required = False)

print(parser.parse_args())
# Namespace(input=None, output=None, planar=None, random=100)
print(parser.parse_args("-r 77".split()))
# Namespace(input=None, output=None, planar=None, random=77)
print(parser.parse_args("-o some/path".split()))
# Namespace(input=None, output='some/path', planar=None, random=100)
print(parser.parse_args("-i some/path".split()))
# Namespace(input='some/path', output=None, planar=None, random=100)
print(parser.parse_args("-i some/path -o some/other/path".split()))
# Namespace(input='some/path', output='some/other/path', planar=None, random=100)
print(parser.parse_args("-r 42 -o some/other/path".split()))
# Namespace(input=None, output='some/other/path', planar=None, random=42)
如您所见,
random
选项默认为100,即使:

  • 提供了
    输出
    选项,这似乎很正常
  • 提供了来自互斥组而非
    随机
    的选项,这可能会有问题。如果
    random
    是唯一具有值的独占选项,则必须先签入代码,然后再将其考虑在内

此示例还包括对选项解析器的一些微小改进:

  • 使用带有两个破折号的长选项名(这是一种惯例,但也允许argparse正确识别选项名)
  • 删除选项定义中的
    nargs=1
    ,这将使您检索一个值的列表。通过删除它,您可以直接检索该值
100
已经是
args.random的默认值。如果您不想要求用户显式地传递所需的组的成员,那么为什么要添加所需的组?我理解OP的方式是,
r=100
仅在完全没有参数的情况下才需要。如果我正确理解你的答案,如果没有给出r,r等于100。@Theeen:OP问题似乎在你的版本中给予了信任。但这可能是缺乏精确性;从我的观点来看,这个版本没有任何意义,因此我更愿意给出这个解决方案,它默认值为
随机
值,即使提供了
输出
选项;)我同意。看来他需要r/i/p中的任何一个。但是,如果我的答案中只给出了-o,则不会提供r/i/p。我需要的是r/i/p是一个独立于-o的组parameter@MarioStefanutti当前位置答案已在我的答案中。通过删除选项声明中的
nargs=1
参数,您不再检索列表,而是检索单个值。因此,您必须通过
args.random
而不是
args.random[0]
来访问该值。这与所有其他选项相同。