我试图使用 argparse 模块,但如果我像这样传递,它就会被接收为字符串 '(1,2,3,4)' 。我试着用 type=tuple 来替换 argparse.add_argument ,但在这里没有用。

我是否需要添加一个新的类型类并将其传递给 add_argument 的类型参数?

我根据答案尝试了 ast.literal_eval 。谢谢你的帮助。但它在结果中给出了空格,如下图所示。

(1,2,3,4)
<type 'str'>
(1, 2, 3, 4)
<type 'tuple'>
    
5 个评论
根据副本,ast.literal_eval将是一个合适的type参数
根据argparse的文件,type必须是一个function(callable)需要一个简单的字符串并将其转换为所需的对象。 替换代码3】接收一个字符串,但将其分割成字符,例如:('(', '1', ',', '2', ')')。 还要小心你的用户给你的--data (1, 2, 3,4)。 shell会在空白处进行分割。
重复链接与解析'(1,2)'这样的字符串有关,但没有解决argparse方面的问题。
stackoverflow.com/a/18003926/901925建议使用json.loads来解析看起来像dict和list(但不是tuples)的字符串。
为什么不直接将参数存储为字符串,并将其传递给eval(),将其转换为元组。
python
tuples
command-line-arguments
argparse
user1423015
user1423015
发布于 2015-11-06
3 个回答
Alastair McCormack
Alastair McCormack
发布于 2021-01-27
已采纳
0 人赞同

datanargs参数设置为nargs="+"(指一个或多个),类型设置为int,然后你可以在命令行上这样设置参数。

--data 1 2 3 4

args.data现在将是一个[1, 2, 3, 4]的列表。

如果你必须有一个元组,你可以这样做。

my_tuple = tuple(args.data)

把这一切放在一起。

parser = argparse.ArgumentParser()
parser.add_argument('--data', nargs='+', type=int)
args = parser.parse_args()
my_tuple = tuple(args.data)
    
对不起,这不是我的要求。请看我的问题一次。我知道这种方法。
那就改变你的要求吧;)用户并不期望必须以特定的方式格式化他们的参数。然而,使用多个参数是正常的。
Alastair, 你是对的。最后我改变了我的要求:-)。
resi
and the greatest of all, in my case, is that you can specify lists of lists with nargs="+" or nargs=<int> combined with action="append", thus allowing multiple occurences of --data in the list of arguments. sweet!
Don Chesworth
Don Chesworth
发布于 2021-01-27
0 人赞同

如果你想扩大这个规模,不处理语法树,并在参数中提供元组转换,你需要一个自定义的argparse类型。(我需要这个,因为我的分析器在一个包里,我不想要求我的用户都写my_tuple = tuple(args.data)。有了参数类型,你也可以像原来的问题那样接收一个带括号的字符串。另外,我不会包括nargs,因为那会把你的自定义类型输出包成一个列表,这基本上违背了你的自定义类型的目的。我映射了一个float,因为我的输入是类似 "0.9, 0.99 "的东西,但是你的int也是一样的。

def tuple_type(strings):
    strings = strings.replace("(", "").replace(")", "")
    mapped_int = map(int, strings.split(","))
    return tuple(mapped_int)
parser = argparse.ArgumentParser()
parser.add_argument('--data', type=tuple_type)
args = parser.parse_args()

这样你就可以发送--data "(1,2,3,4)"--data "1,2,3,4"

miken
miken
发布于 2021-01-27
0 人赞同

我有同样的要求。在标准包中找不到。所以,就推出了这个。 Python 3x。放在简单的argv解析器中,一次调用一个参数。

  • var is passed in default, of correct type.
  • argval is found command line string. Comma separated,no spaces. i.e. 1,2,3 or one,two,three.
  • 在bash shell下工作,可能需要引号,其他shell和操作系统也需要调整。 同样的技术适用于非列表类型。这个版本在var[0]的基础上创建一个同质的列表或元组。

    ./foo.py   --mytuple 1,2,3,4,5
    

    code:

    def chk_arg( var, argstr, dbg=False): 
        ### loop on sys.argv here .....