简体   繁体   English

如果没有传递命令行参数,则为Python默认参数

[英]Python default parameter if no command line arguments are passed

I'l like to build a program with this behaviour: 我想用这种行为来构建程序:

usage: sage 4ct.py [-h] (-r R | -i I | -p P) [-o O] 用法:鼠尾草4ct.py [-h](-r R | -i I | -p P)[-o O]

But if you don't give any parameter, I'd like to have "-r 100" as the default. 但是,如果您不提供任何参数,我希望将“ -r 100”作为默认值。

Is it possible? 可能吗?

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()

Just remove the required argument of the add_mutually_exclusive_group function call (or set it to False) and you're done: 只需删除add_mutually_exclusive_group函数调用的required参数(或将其设置为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)

As you can see, the random option is defaulted to 100 even if: 正如你所看到的, random选项默认为即使100:

  • the output option is provided, which seems normal 提供了output选项,这看起来很正常
  • an option from the mutual exclusive group other than random is provided, which can be problematic. 提供了互斥组中除了random之外的选项,这可能会出现问题。 you will have to check in your code if random is the only exclusive option which has a value before taking it in account. 您必须先检查代码是否是random唯一具有值的独占选项,然后再考虑它。

This example also includes some tiny improvement to your option parser: 此示例还包括对选项解析器的一些微小改进:

  • use long option names with two dashes (it is a convention but it also allows argparse to correctly recognise option name). 请使用带有两个破折号的长选项名称(这是一个约定,但是它也允许argparse正确识别选项名称)。
  • remove the nargs=1 in your options definitions which makes you retrieve a list of one value. 删除选项定义中的nargs=1 ,使您可以检索一个值的列表。 By removing it, you could retrieve directly the value. 通过删除它,您可以直接检索值。

Give the following a try: 尝试以下操作:

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:])

Essentially you are checking if any commandline parameters are given at all, and if not, you append the desired -r 100 本质上,您正在检查是否有任何命令行参数,如果没有,则附加所需的-r 100

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM