2013-07-03 2 views
3

무한 반복하지 않고이 코드를 작성하려면 어떻게해야합니까?Python에서 개체 이동

fields = row.split('__') 

if len(fields) == 1: 
    foo = getattr(bundle.obj, fields[0]) 
elif len(fields) == 2: 
    foo = getattr(getattr(bundle.obj, fields[0]), fields[1]) 
elif len(fields) == 3: 
    foo = getattr(getattr(getattr(bundle.obj, 
          fields[0]), fields[1]), fields[2]) 
# etc .. 

답변

10

사용 reduce() :

foo = reduce(getattr, fields, bundle.obj) 

또는 간단한 루프 : 나는 매우 유용한 또 다른 내장 함수에 대해 배울 매일 같은 느낌

foo = bundle.obj 
for field in fields: 
    foo = getattr(foo, field) 
+0

. 그 귀도는 하나의 영리한 자비로운 독재자입니다. –

+0

@JasonSperske : 사실, Guido는 초기에'reduce '를 추가하도록 누가 확신했는지 기억하지 못합니다. 그러나 그는 그 이후로 그것을 없애고 싶습니다. 그리고 다른 많은 핵심 개발자들은 그에 동의합니다. 그들은 열정으로 그것을 싫어하고, 3.0 전환에서 간신히 그것을 "functools"로 옮기라고 설득했고, 그것을 완전히 제거하는 대신 그것에 대해 이야기하는 것을 그만 두었습니다. (개인적으로'reduce '가 좀 더 읽기 쉽도록 희소하게 만드는 경우가 있다고 생각합니다. 그러나 이것은 분명히 그들 중 하나입니다.) – abarnert

+0

@abarnert : 그것은 그 불쾌한 리스프 사람들 중 하나 였음에 틀림 없습니다. : D (필자는 "우리 중 한 명"이라고 말할 것입니다. "필자가 AI 대학원생들과 어울리고 있었을 때도 많은 Lisp을 쓰지 않았다는 것을 제외하고는 ....)지도에 대해 불평하지 않았습니다. '뿐만 아니라? – torek