Python如何从argparse填充字符串

hit*_*jim 7 python string parsing user-input argparse

我很好奇使用argparse后幕后发生的事情.我在这里这里检查,因为显然Namespace目前只存在于argparse库中.

我可能使用错误的关键字搜索SO/Google.我也可能会问一个毫无意义或明显的问题,但我们走了.

通过argparse捕获Python中的输入字符串时:

>python palindrome.py 'Taco cat!?'
Run Code Online (Sandbox Code Playgroud)

当运行下面的代码时,我希望通过指定parser.add_argument('string'... ...结果Namespace充当单个输入字符串的缓冲区.

我将字符串分配给"args"的下一行必须是我们第一次实际解析输入,从而产生与输入字符串长度成比例的工作负载.此时,"args"实际上包含一个Namespace对象,该对象无法通过for循环或其他方式解析(我知道).

最后,为了使用"for"或其他一些循环来解析输入,我使用Namespace对象来填充字符串.我很好奇这个过程多少次会产生与原始字符串长度成比例的计算时间?

这些步骤中的哪一个按地址复制或在幕后复制值?看起来乐观的更糟糕的情况是2倍.一旦创建Namespace对象,然后再次将其内容分配给"arg_str"

#! /usr/bin/env python
import sys
import argparse

parser = argparse.ArgumentParser(description='Enter string to see if it\'s a palindrome.')
parser.add_argument('string', help="string to be tested for palindromedness..ishness")
args = parser.parse_args()

arg_str = args.string

# I can parse by using 'for i in arg_str:' but if I try to parse 'for i in args:'
# I get TypeError: "Namespace' object is not iterable
Run Code Online (Sandbox Code Playgroud)

谢谢你的期待!!

hpa*_*ulj 2

操作系统(或 shell)首先解析命令行,将字符串传递给 Python 解释器,您可以在其中将它们作为数组进行访问sys.argv

python palindrome.py 'Taco cat!?'
Run Code Online (Sandbox Code Playgroud)

变成

['palindrome.py', 'Taco cat!?']
Run Code Online (Sandbox Code Playgroud)

parser.parse_args()处理这些字符串,通常只是传递引用。当基本参数被“解析”时,该字符串将“存储”在命名空间中setattr(Namespace, dest, value),在您的示例中相当于setattr(namespace, 'string', sys.argv[1])

没什么特别的argparse.Namespace。它是 的一个简单子类Object。参数是简单的对象属性。 argparse使用setattrgetattr来访问这些,尽管用户通常可以使用dot格式 ( args.string)。它不进行任何特殊的字符串处理。这完全是Python 的责任。

命名空间不是可迭代的,也就是说,它不是列表或元组或类似的东西。它是一个物体。命名空间可以转换为字典vars(args)(在 argparse 文档中)。keys所以你可以使用and迭代该字典items

另一件事。不要arg.string用 来测试你的is。使用==in []将其与其他字符串进行比较。这是因为通过创建的字符串与通过创建的字符串sys.argv不同。要了解原因,请尝试:idx = 'test'

argv = 'one two three'.split()
print argv[0]=='one' # true
print argv[0] is 'one'  # false
print argv[0] in ['one', 'two','three'] # true
x = 'one'
print x is 'one' # true
print id(x)
print id('one')
print id(argv[0])
Run Code Online (Sandbox Code Playgroud)

在可能的情况下,Python 确实会保留字符串的唯一副本。但如果字符串以不同的方式生成,它们将具有不同的id,并且不能满足测试is