如何将一个或多个参数传递给python,将它们与可选的过滤器参数匹配,并仅将匹配的参数添加到数组中?

How do I pass one or more arguments to python, match them against an optional filter argument, and add only matching arguments to an array?

提问人:skeetastax 提问时间:11/9/2023 更新时间:11/10/2023 访问量:34

问:

我想:

  1. 一个或多个 ()* 参数传递给 Python 脚本,named
  2. 将可选参数也传递给脚本,filter
  3. 将所有其他匹配(如果提供)argumentsfilter
  4. 将 all(如果提供,则匹配 filter 参数)添加到 ,argumentsarray[]
  5. 如果给出 no 或仅给出参数,则退出 (is dependent on - requires - other )。error message and syntax helpargumentsfilterfilterarguments

例如:

python script.py

应该生成帮助消息,然后退出。usage

python script.py --arg string

应将 arg 添加到 .stringarray[]

python script.py --arg string1 --arg string2 --arg string3

应将 all 添加到 .argumentsarray[]

python script.py --arg string1 --arg string2 --arg string3 --filter '*2*'

应该只添加那些与过滤器匹配的参数,所以在这种情况下,它只会添加到 并忽略其余的。array[]string2array[]

所以:

  1. 必须至少有一个参数
  2. 最多必须有一个过滤器参数

这是一个示例,但它没有按预期工作,因为我认为没有以我上面解释的方式运行 - 它只需要任何一个参数,但没有指定需要哪一个参数:group = parser.add_mutually_exclusive_group(required=True)

import argparse

# Create an ArgumentParser object
parser = argparse.ArgumentParser(description='Dependent argument testing')

# Create a mutually exclusive group for the --arg and --filter options
group = parser.add_mutually_exclusive_group(required=True)

# Define the --arg argument (required)
group.add_argument('--arg', type=str, help='Specify the argument')

# Define the --filter argument (optional)
group.add_argument('--filter', type=str, help='Specify the filter (optional)')

# Parse the command-line arguments
args = parser.parse_args()

# Access the values of the arguments
if args.arg:
    print(f'Argument: {args.arg}')
if args.filter:
    print(f'Filter: {args.filter}')
python 依赖项 argparse 可选参数

评论

0赞 Karl Knechtel 11/9/2023
只收集所有指定的参数和指定的过滤器值(如果有的话),然后使用普通程序逻辑和结果对象进行事后过滤有什么问题?(另外:我们在 Python 中称它们为列表,而不是“数组”。除非你使用 Numpy、标准库模块或其他类似的东西以更低级的方式操作数据。argsargs.argarray

答:

0赞 hpaulj 11/9/2023 #1

忘记相互排斥的群体。

要获得

script.py --arg string1 --arg string2 --arg string3 --filter '*2*'

使用“-h/--help”获取自动使用和帮助。在没有给出任何参数的情况下尝试使用是可能的,但我认为不值得付出额外的努力。

将 '--arg' 定义为 'append',您可以根据需要字符串。

'--filter' 可以是默认的 'store'。

包括要测试的。print(args)

剩下的就是后期解析逻辑和代码。

编辑

我希望有一个像这样的命名空间args

Namespace('arg'=['arg1','arg2','arg3'], 'filter'='*2*')

if args.filter is None:
    ...

测试是否提供了过滤器

if args.arg is empty:
     .....

测试是否提供。

循环访问以应用并构建新列表。for 循环或列表推导应该有效。args.argfilter

参数也可以是 而不是 .argnargs='+'action='append'

如果两个属性都为空,则可以调用并退出。argsparse.print_usage()