2017-10-21 189 views
0

我怎么能一个namedtuple的创建实例动态?可能吗?在运行时从字符串创建namedtuple实例(反射/动态创建)

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__ 

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

+0

你知道的名称*电话*是一个严重的反模式?此外,这里做这件事非常不安全,因为“类型”被构造为函数调用的产物。 –

回答

0

这将无反射所需的工作:

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)) 

通过了所有测试,输出:

我们总是用“你好,世界”作为一个例子。