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

Python default parameter if no command line arguments are passed

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

用法:鼠尾草 4ct.py [-h] (-r R | -i I | -p P) [-o 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

只需删除 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)

如您所见,random 选项默认为 100,即使:

  • 提供了output选项,看起来很正常
  • 提供了 random 以外的互斥组选项,这可能会有问题。如果 random 是唯一具有值的独占选项,则必须在考虑之前检查代码。

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

  • 使用带有两个破折号的长选项名称(这是一种约定,但它也允许 argparse 正确识别选项名称)。
  • 删除选项定义中的 nargs=1,这样您就可以检索一个值列表。通过删除它,您可以直接检索该值。