在运行时从字符串创建 namedtuple 实例(反射/动态创建)

Sha*_* M. 3 reflection runtime namedtuple python-3.x

如何动态创建命名元组的实例?是否可以?

Msg = collections.namedtuple('Msg', 'a b c')
...
mymsg = Msg(a=1,b=2,c=3)
msg_as_dict = mymsg._asdict()
msg_as_dict['recover_name'] = type(mymsg).__name__
Run Code Online (Sandbox Code Playgroud)

如何从msg['recover_name']运行时创建 Msg 实例?

更新:如何在运行时获取 namedtuple 的类型?意思是,从存在实例中获取“消息”。

IAb*_*act 5

这将无需反射即可工作:

def test_tuple_builder(self):
    from collections import namedtuple

    name = "Foo"
    attribs = "bar baz goo tar taz"
    values = [100, "Hello", -1, "World", "1968"]

    tpl_cls = namedtuple(name, attribs)
    foo = tpl_cls(*values)

    self.assertEqual(values[0], foo.bar)
    self.assertEqual(values[1], foo.baz)
    self.assertEqual(values[2], foo.goo)
    self.assertEqual(values[3], foo.tar)
    self.assertEqual(values[4], foo.taz)

    print("We always use '{baz}, {tar}' as an example.".format(baz=foo.baz, tar=foo.tar))
Run Code Online (Sandbox Code Playgroud)

所有测试都通过,输出:

我们总是以“Hello, World”为例。