【问题标题】:How to pass a list of tuples as an argument parameter?如何将元组列表作为参数参数传递?
【发布时间】:2022-01-02 10:41:58
【问题描述】:

我正在编写一个 python 脚本,我想在其中传递一个元组/列表列表。我尝试使用 argparse 模块,但找不到将元组列表作为参数传递的方法(即[(1,2),(3,4),(5,6)])。

到目前为止我已经尝试过:

  • 我知道我可以使用nargs='+',但这只能让我传入一个值列表。
  • 我试过parser.add_argument('--pairs', type=tuple, nargs='+'),但我得到了
 $ python test.py --pairs (1,2) (2,4)
-bash: syntax error near unexpected token `('

有没有人有任何使用 argparse 模块(或任何其他模块)的示例?

这是脚本。没什么特别的,只是想传入元组列表并确保我可以正确打印和访问元素:

import argparse

def test(args):
    print("----")
    print(args.pairs)

if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('--pairs', type=tuple, nargs='+')

    args = parser.parse_args()
    print("===args===")
    for arg in vars(args):
        print(arg, getattr(args, arg))

    test(args)

【问题讨论】:

  • 你能显示你的函数的代码吗?
  • @anarchy 我刚刚更新了它以包含代码。
  • "(" 和 ")" 是 bash 中的特殊字符,用于其他用途。您需要引用它们(就像您在回答中所做的那样)。即 python test.py --pairs "(1,2) (2,4)";然后将字符串转换为元组。

标签: python arguments


【解决方案1】:

我想出了一种方法,但如果有更好的方法,请告诉我。

我使用了 ast 模块并将参数作为字符串传递并使用了 ast 模块(大声说出我找到的答案here

这是我更新的代码:

import argparse
import ast

def test(args):
    pairs = ast.literal_eval(args.pairs)
    print(args.pairs, type(args.pairs))
    print(type(pairs))
    print(pairs[0])
    print(pairs[0][1])

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--pairs')

    args = parser.parse_args()

    test(args)

测试这个结果:

$ python test.py --pairs '[(1,2),(3,4)]'
[(1,2),(3,4)] <class 'str'>
<class 'list'>
(1, 2)
2

【讨论】:

    【解决方案2】:

    您不能将括号放在您的参数上,因为它们是 bash/zsh 语法中的特殊标记字符,您可以将其括在引号中 "(1,2)" "(2,4)" 或删除它们 1,2 2,4 两种方式您都可以创建自己的@ 987654323@

    第一种情况:

    import ast
    
    parser.add_argument('--pairs', type=lambda a: ast.literal_eval(a), nargs='+')
    

    第二种情况:

    parser.add_argument('--pairs', type=lambda a: tuple(map(int, a.split(','))), nargs='+')
    

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 2013-04-21
      • 2021-10-17
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2016-11-18
      • 2011-10-05
      相关资源
      最近更新 更多