2011. 7. 1. 23:22

[ Problem ] - http://huge:file@www.pythonchallenge.com/pc/return/disproportional.html

♧ 타이틀은 'call him', 'phone that evil' 이란 힌트와 함께 전화기 그림이 보인다.

즉, 악마에게 전화를 걸어야 하는데 그 악마가 누구인지 어떻게 호출해야 될지 모른다.

   

▷ 그림의 숫자'5'에는 링크가 걸려 있는데 클릭해 들어가 보면 XML형식의 코드가 보인다.

   

▷ 이는 XML-RPC Fault 형식과 유사한데 XML-RPC란,

인코딩 형식은 XML을 채택하고, HTTP를 통한 간단하고 이식성 높은 원격 프로시저 호출 방법을 제공하는

RPC 프로토콜의 일종이다.

   

   

▷ 파이썬 2.2부터 XML-RPC가 표준 모듈(xmlrpclib)로 포함되어 있으므로 따로 설치할 필요는 없다.

▷ 주요 함수는 다음과 같다.

♧ 주요 함수

ServerProxy.system.listMethods

- 서버가 어떠한 프로시저를 제공하는지 문자열 이름들을 리스트 형태로 출력.
ServerProxy.system.methodSignature(name)

- 프로시저가 어떻게 호출되는지 서명(인수 전달 목록)의 리스트를 돌려준다.
ServerProxy.system.methodHelp(name)

- 프로시저를 설명하는 문서 문자열을 가져다 준다.

   

▷ 위의 주요 함수를 통하여 해당 서버(phonebook)의 프로시저에 대한 정보를 출력해보자.

#encoding=utf8
from pprint import pprint
import xmlrpclib

# ① 해당 XML-RPC를 지원하는 phonebook 서버에 접속.
url = 'http://www.pythonchallenge.com/pc/phonebook.php'
phonebook = xmlrpclib.Server(url)

# ② 서버가 어떠한 API 제공하는지 리스트 형태로 출력.
pprint (phonebook.system.listMethods())

# ③ 'phone'에 대한 도움말 정보 얻기.
print phonebook.system.methodHelp("phone")

# ④ 'phone'에 대한 인수 목록 알아내기.
print phonebook.system.methodSignature('phone')

   

[ 출력 결과 ]

['phone',

'system.listMethods',

'system.methodHelp',

'system.methodSignature',

'system.multicall',

'system.getCapabilities']

Returns the phone of a person

[['string', 'string']]

▷ 위의 마지막 methodSignature('phone')의 결과로 얻어진 [['string', 'string']] 에서

처음 'string'은 프로시저의 리턴형이고 나머지는 입력 인수의 형이다.

▷ 즉, phone은 특정 이름을 string형으로 받아 string형으로 리턴 해주는 프로시저다.

   

▷ 악마는 누구인가!

이제 악마에게 전화를 거는 방법을 알았으니 그 악마가 누구 인지만 알면 된다.

Level12에서의 기억을 상기 시켜보면 evil4.jpg 에는 빈 화면이 보이는데

이것을 편집기로 보면 'Bert is evil! go back!' 라는 메시지가 출력 되었다.

즉, Bert가 evil이다.

   

▷ Bert에게 전화를 걸어 보자. (※ 위 소스코드 마지막 줄에 추가)

# ⑤ Bert에게 전화 걸기.
print phonebook.phone('Bert')

   

[ 출력 결과 ]

555-ITALY

  

   

[ Solution ] - http://huge:file@www.pythonchallenge.com/pcc/return/italy.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix