argparse 库处理转义字符(如\t 到制表符和\n 到换行符)的方式与我喜欢的不同。 An answer to this question给出了一个解决方案,但我想让它对用户不那么明显。
给定程序:
#!/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 将参数传递给 argparse 的方式,因此不在我的手中? 如果这是真的,这是否通常记录给用户,或者这种行为是否被认为是正常的?
最佳答案
假设问题部分是关于如何执行@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
。无论如何,由于没有检查机制,此解决方案可能很危险......
关于python - 将 argparse 转义字符作为选项处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34145686/