我的脚本使用-d,--delimiter作为参数:

parser.add_argument('-d', '--delimiter')

但当我将其作为分隔符传递给它时,它是空的

script.py --delimiter='--' 

我知道--在实参/参数解析中是特殊的,但我在表单--option='--'中使用它并将其引用.

为什么它不起作用呢? 我使用的是Python3.7.3

以下是测试代码:

#!/bin/python3

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--delimiter')
parser.add_argument('pattern')

args = parser.parse_args()

print(args.delimiter)

当我将其作为script --delimiter=-- AAA运行时,它会打印空的args.delimiter.

推荐答案

这看起来像是个窃听器.你应该go 报案.

argparse.py中的This code_get_values的开始,_get_values是用于解析值的主要助手函数之一:

if action.nargs not in [PARSER, REMAINDER]:
    try:
        arg_strings.remove('--')
    except ValueError:
        pass

该代码接收--参数作为列表['--']的单个元素.它试图从列表中删除'--',因为当使用--作为选项结束标记时,对于_get_values个调用中的一个,'--'字符串将以arg_strings结尾.但是,当'--'是实际的参数值时,代码仍然会删除它,因此arg_strings最终是一个空列表,而不是单元素列表.

然后,代码通过一个Else-If链来处理不同类型的参数(这里省略了分支主体以节省空间):

# optional argument produces a default when not present
if not arg_strings and action.nargs == OPTIONAL:
    ...
# when nargs='*' on a positional, if there were no command-line
# args, use the default if it is anything other than None
elif (not arg_strings and action.nargs == ZERO_OR_MORE and
      not action.option_strings):
    ...
# single argument or optional argument produces a single value
elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:
    ...
# REMAINDER arguments convert all values, checking none
elif action.nargs == REMAINDER:
    ...
# PARSER arguments convert all values, but check only the first
elif action.nargs == PARSER:
    ...
# SUPPRESS argument does not put anything in the namespace
elif action.nargs == SUPPRESS:
    ...
# all other types of nargs produce a list
else:
    ...

这个代码应该经过第三个分支,

# single argument or optional argument produces a single value
elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:

但是因为arg_strings中缺少参数,所以len(arg_strings)是0.相反,它触及了最后一个 case ,该 case 本应处理一种完全不同的论点.该分支最终返回一个空列表,而不是本应返回的'--'个字符串,这就是args.delimiter最终是一个空列表而不是'--'字符串的原因.


这个错误也表现为位置参数.例如,

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('a')
parser.add_argument('b')

args = parser.parse_args(["--", "--", "--"])

print(args)

fingerprint

Namespace(a='--', b=[])

因为当_get_values处理b参数时,它将['--']作为arg_strings接收,并删除'--'.在处理a参数时,它收到['--', '--'],表示一个选项结束标记和一个实际的--参数值,并且它成功地删除了选项结束标记,但在处理b时,它删除了实际的参数值.

Python相关问答推荐

如何找出Pandas 图中的连续空值(NaN)?

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

为什么在Python中00是一个有效的整数?

正在try 让Python读取特定的CSV文件

PYTHON中的selenium不会打开 chromium URL

通过对列的其余部分进行采样,在Polars DataFrame中填充_null`?

为什么在更新Pandas 2.x中的列时,数据类型不会更改,而在Pandas 1.x中会更改?

如何使用Polars从AWS S3读取镶木地板文件

了解如何让库认识到我具有所需的依赖项

将时间序列附加到数据帧

Django REST框架+Django Channel->;[Errno 111]连接调用失败(';127.0.0.1';,6379)

使用pytest测试是否缺少导入

PANDA:如何将多选列转换为索引/列

当使用随机均匀(a,b)时,b是包含的还是排他的?

滚动加权平均(或类似)填充失踪大Pandas

Python:将带有UNNESTED div标签的html文档解析为dataframe(使用Beautiful Soup )

提供不正确结果的Python IP验证

是否有与字节文字等价的函数?

如何在0.20.7之前的版本中实现POLARS';之前的`vot()‘功能?