python - 将 argparse 转义字符作为选项处理

标签 python delimiter argparse

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/

相关文章:

python - 如何使用python和beautiful soup将一个html页面拆分为多个页面

python - 除了 DBUS 之外,是否有任何新的 python 库支持 systemd 功能

python - 如何为下面的字典创建 json 字符串

mysql - 分隔符在 MySQL 5.1 上不起作用

python - 使用 argparse 保持参数不变

java - 如何从服务器接收到的 xmlrpc 处理/读取 java 对象

Python Pandas - 写入 to_csv 时使用多字符定界符

notepad++ - 在 Notepad++ 中定义单词分隔符

python - argparse.REMAINDER 改变位置参数的行为

python - argparse .ArgumentParser 引发 ArgumentError