我很好奇使用 argparse 时幕后发生了什么。 我在这里检查过在这里,显然命名空间目前只存在于 argparse 库中。
我可能使用了错误的关键字来搜索SO/Google。 我也有可能在问一个毫无意义或明显的问题,但我们开始了。
当通过argparse在Python中捕获输入字符串时:
>python palindrome.py 'Taco cat!?'
在运行下面的代码时,我希望通过指定 parser.add_argument('string'...生成的命名空间充当单个输入字符串的缓冲区。
我将字符串分配给"args"的下一行必须是我们第一次实际解析输入,从而产生与输入字符串长度成比例的工作负载。 在这一点上,"args"实际上包含一个命名空间对象,它不能通过 for 循环或其他方式(我知道(解析。
最后,为了使用"for"或其他循环解析输入,我使用 Namespace 对象来填充字符串。 我很好奇这个过程会产生多少次与原始字符串长度成比例的计算时间?
其中哪一个步骤在后台按地址复制或按值复制? 看起来乐观的最坏情况是 2 倍。 一次创建命名空间对象,然后再次将其内容分配给"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
感谢您的观看!!
操作系统(或 shell(首先解析命令行,将字符串传递给 Python 解释器,在那里您可以作为 sys.argv
数组访问它们。
python palindrome.py 'Taco cat!?'
成为
['palindrome.py', 'Taco cat!?']
parser.parse_args()
处理这些字符串,通常只需传递引用即可。 当一个基本参数被"解析"时,该字符串被"存储"在命名空间中,setattr(Namespace, dest, value)
,在你的例子中,这相当于setattr(namespace, 'string', sys.argv[1])
。
argparse.Namespace
没有什么特别的. 它是Object
的简单子类。 参数是简单的对象属性。 argparse
使用setattr
和getattr
来访问这些,尽管用户通常可以使用dot
格式(args.string
(。 它不执行任何特殊的字符串处理。 这完全是Python的责任。
命名空间不是可迭代对象,也就是说,它不是列表或元组或类似的东西。 它是一个对象。 命名空间可以转换为具有 vars(args)
的字典(在 argparse 文档中(。 因此,您可以使用keys
和items
遍历该字典。
还有一件事。 不要用is
测试你的arg.string
。 使用 ==
或 in []
将其与其他字符串进行比较。 这是因为通过 sys.argv
创建的字符串与通过 x = 'test'
创建的字符串具有相同的id
。 要了解原因,请尝试:
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])
在可能的情况下,Python确实保留了字符串的唯一副本。 但是,如果字符串以不同的方式生成,它们将具有不同的 ID,并且不满足is
测试。
Python 赋值从不复制东西。变量是对象的名称;将对象分配给变量会给对象一个新名称(从以前的名称中获取名称(。在低级术语中,它相当于一个指针复制和一些引用计数操作。
此代码的任何部分都不需要复制输入字符串。不过,如果是这样,那就没关系了。命令行参数不能(也不应该(足够长,以至于与运行时的其余部分相比,您可能花费的复制时间很长。