2017-10-21 10 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

당신은 * 이름으로 전화하는 것이 심각한 반 패턴인가요? 게다가 "type"이 함수 호출의 생성물로 만들어지기 때문에 여기서는 이렇게하는 것이 안전하지 않습니다. –

답변

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

모든 테스트는 출력을 전달합니다.