迭代命名空间

问题描述 投票:0回答:2

我有一个如下所示的命名空间:

命名空间(aTQ=无,bE=无,bEQ=无,b=无,bQ=无,c=无, c=无, cJ=无, d=无, g=无, jR=['xx', '015'], lC=无, l=无)

如何迭代它以便我可以找到并替换“jR”键的“xx”值?

python namespaces
2个回答
26
投票

我不确定您事先知道什么(名称

jR
,或者只有一个名称具有
not None
值),但您可以尝试使用
vars()
,它与
__dict__
一样应该是一个字典,将名称空间中的名称作为其键。 所以如果你在某处有字符串
'jR'

vars()['jR'] = vars()['jR'][0]

同样,您可以使用

namespace.__dict__
而不是
vars()

获得相同的字典

将为您留下

['xx','015']
中的第一个值作为
jR
的唯一值。

需要明确的是,由于

vars()
__dict__
都返回字典,因此您可以将它们迭代为:

for k in namespace.__dict__:
    if namespace.__dict__[k] is not None:
        <<do something>>

0
投票

老问题,但我想无论如何我都会插话。 我假设 OP 正在使用

argparse
模块并希望迭代并修改其参数。 有一个名为
_get_kwargs()
的受保护方法,
Namespace
对象可以调用该方法。 它返回键/值元组的列表。 我不明白为什么 argparse 的作者认为这个特定的方法需要受到保护,但请注意它是并且使用时需要您自担风险。

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--foo', help='The foo argument', type=str)
parser.add_argument('--bar', help='The bar argument', type=int)

original_args = parser.parse_args()
modified_args = argparse.Namespace()

for key, val in original_args._get_kwargs():
    if key == 'bar':
        new_bar_val = 2
        setattr(modified_args, key, new_bar_val)
    else:
        setattr(modified_args, key, val)

print(f'Original args: {original_args}')
print(f'Modified args: {modified_args}')

如果您使用命令

argparse_test.py --foo asdf --bar 1
运行此代码,它将输出以下内容:

Original args: Namespace(foo='asdf', bar=1)
Modified args: Namespace(foo='asdf', bar=2)
© www.soinside.com 2019 - 2024. All rights reserved.