10

抱歉,如果之前有人问过这个问题,我确实搜索过它,但所有点击似乎都是关于 python 原始字符串,而不是关于 argparse。

无论如何,我有一个代码,用户输入一个字符串,然后处理这个字符串。但是,我有一个问题,因为我希望我的代码能够区分\n\\n以便用户可以控制他们是否获得换行符或\n出现在输出中(分别)。

这本身很简单,我可以让逻辑工作来检查字符串等。但是,argparse 似乎并没有保持输入字符串的原始状态。因此,如果我要写:Here is a list:\nItem 1它会被解析为Here is a list:\\nItem 1. \n如果我在输入字符串中替换为完全相同的内容,则解析完全相同的内容\\n,因此无法区分两者。

我可以包含一个 bodge(例如,我可以让用户输入 say $\nfor\n以显示在输出中,或者只是\n换行)。但这很混乱并且使代码的使用复杂化。

有没有办法确保 argparse 解析的字符串是原始的?(即,如果我输入\n它解析\n而不是\\n

再一次,很抱歉,如果以前有人问过这个问题,但我找不到答案,经过一个多小时的尝试寻找答案,我没有想法(禁止)。提前为任何和所有帮助干杯。

示例代码(对不起,如果这不起作用,不确定如何最好地为 argparse 做示例代码!):

import argparse

parser = argparse.ArgumentParser( description = 'Test.' )
parser.add_argument( 'text', action = 'store', type = str, help = 'The text to parse.' )

args = parser.parse_args( )

print( repr( args.text ) )
4

3 回答 3

4

这是您的问题的可能解决方案:

import argparse

parser = argparse.ArgumentParser(description='Test.')
parser.add_argument('text', action='store', type=str, help='The text to parse.')

args = parser.parse_args()

print '-' * 80
raw_text = eval('"' + args.text.replace('"', '\\"') + '"')
print raw_text
print '-' * 80
print args.text

但是要注意一件事,eval 真的很危险

于 2016-08-24T10:21:21.763 回答
2

如评论中所述,argparsesys.argv由 shell 和 Python 解释器生成的列表一起使用。

使用简单的argvecho 脚本:

0928:~/mypy$ cat echo_argv.py
import sys
print(sys.argv)

我得到(使用 bash shell):

0929:~/mypy$ python echo_argv.py Here is a list:\nItem 1 
['echo_argv.py', 'Here', 'is', 'a', 'list:nItem', '1']
0931:~/mypy$ python echo_argv.py "Here is a list:\nItem 1 "
['echo_argv.py', 'Here is a list:\\nItem 1 ']
0931:~/mypy$ python echo_argv.py "Here is a list:\\nItem 1 "
['echo_argv.py', 'Here is a list:\\nItem 1 ']

argparse将其argv视为字符串列表。它对这些字符串没有任何作用,至少对默认None type参数没有作用。

于 2016-08-24T16:34:13.423 回答
2

正如@hpaulj 指出的那样,您的问题源于外壳和sys.argv工作方式。您的选择是使用您获得的转义字符处理字符串。

看看这个关于 SO 的答案: Process escape sequences in a string in Python 。基本上,使用string_escapeorunicode_escape来处理字符串。这比手动处理你的字符串要好。

于 2017-10-05T19:00:31.587 回答