作为选项处理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