作为选项处理argparse转义字符

argparse库处理转义字符(如 t选项卡和 n换行符)不同于我的偏好。 对这个问题的回答给出了一个解决方案,但是我想让它对用户不太明显。

鉴于该计划:

#!/usr/bin/env python3
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-d', '--delimiter', default='t')
args = parser.parse_args()
print(args)

您将收到此输出:

bash$ parser.py -d t
Namespace(delimiter='t')

bash$ parser.py -d t
Namespace(delimiter='t')

bash$ parser.py -d 't'
Namespace(delimiter='t')

bash$ parser.py -d 't'
Namespace(delimiter='\t')

bash$ parser.py -d "t"
Namespace(delimiter='t')

bash$ parser.py -d "t"
Namespace(delimiter='t')

bash$ parser.py -d $'t'
Namespace(delimiter='t')

bash$ parser.py -d $'t'
Namespace(delimiter='t')

bash$ parser.py -d $"t"
Namespace(delimiter='$t')

bash$ parser.py -d $"t"
Namespace(delimiter='$t')

我只用了所需的参数

parser.py -d $'t'

但我更喜欢输入看起来像

parser.py -d t 

或更不优选

parser.py -d 't'
parser.py -d "t"

如果我想改变行为,这是我可以使用argparse库做些什么吗? 如果没有,我是否可以在现有的argparse库上编写行为? 如果没有,这是否仅仅是bash通过争论的方式,因此不在我手中? 如果这是真的,这是通常记录给用户的东西,还是这种行为被认为是正常的?


您在namespace看到的字符串恰恰是出现在sys.argv的字符串 - 它是由bash和解释程序创建的。 parser不处理或调整此字符串。 它只是在namespace设置值。 你可以在解析之前通过打印sys.argv来验证。

如果你很清楚用户想要什么,那么我建议在解析后修改args.delimiter 。 解析器的主要目的是弄清楚用户需要什么。 作为程序员,您可以以任何方式插入和应用这些信息。

一旦你找到了一个令人满意的后解析函数,你可以将它作为这个参数的type来实现(比如int()float()对数字字符串所做的)。 但关注解析后处理。


假设问题部分是关于如何执行由@hpaulj解释的后处理,并且由于我无法在上面的链接中看到Python 3的即时解决方案,下面是一个快速解决方案:

import codecs

def unescaped_str(arg_str):
    return codecs.decode(str(arg_str), 'unicode_escape')

然后在解析器中:

parser.add_argument('-d', '--delimiter', type=unescaped_str, default='t')

这会让你不那么理想的情况下工作:

parser.py -d 't'
parser.py -d "t"

但不是所需的非转义t 。 无论如何,这种解决方案可能是危险的,因为没有检查机制......


就我个人而言,我只是期望这种行为 - 你的shell解释一些项目,并传递一个字面标签,或者一个反斜杠和一个字母t,而不一定要Python程序做第二级解释(并且没有任何argparse做它)。

尽管如此,Python已经为此建立了解释器; 看到这个问题和答案。

链接地址: http://www.djcxy.com/p/61969.html

上一篇: Handling argparse escaped character as option

下一篇: argparse option for passing a list as option