2013-10-16 2 views
1

flickr-API의 편리한 인터페이스를 Python에 작성하고 싶습니다.편리한 방법으로 도트 구문을 잘못 사용하여 파이썬에서 API에 액세스하는 방법

http://api.flickr.com/services/rest/?method=flickr.X&param1=value1&param2=value2&param3& 

내 생각과 같은

flickr.galleries.addPhoto 
flickr.galleries.create 
flickr.cameras.getBrandModels 
flickr.cameras.getBrands 
etc. 

정상적인 HTTP 요청에서 사용되는 API가 제공하는 방법은 동일한 구문의 메소드를 호출하는 저를 가능하게 수있는 class flickr을 작성했다 파이썬. 클래스 플리커 그래서, 내가 매개 변수로 함수 이름을 사용하도록 getattr 기능을 사용하는 방법에 대한 생각,하지만 불행히도 내가 실패

flickr.X(param1=value1,param2=value2) 

를 호출 할 때 식별자 X=galleries.addPhoto에 액세스하기 위해 저를 사용하도록 설정해야합니다.

도트를 무시한 X의 이름에 액세스하는 방법이 있습니까?

p.s. class flickr은 갤러리, 카메라 등의 "네임 스페이스"의 정확한 구조를 가능한 한 포괄적으로 검사하거나 (또는 ​​유지하지 않아야 함) 나중에 메서드 이름이 변경되므로 영향을받지 않아야합니다.

답변

0

지금까지 파이썬 구문을 늘리는 것이 좋을지 모르지만 getattr 클래스 메서드가 작동합니다. 클래스의 사전에없는 멤버에 액세스 할 때마다 호출되므로 "X"가 클래스 멤버가 아닌지 확인해야하므로 대신 "_X"와 같은 클래스 구조를 사용하고 다음과 같은 클래스 구조를 사용하십시오.

class a(object): 
    def _hi(self): 
     print "hello" 

    def __getattr__(self, val): 
     a.__dict__["_" + val](self) 

>>> b = a() 
>>> b.hi 
hello 

*** 편집 : 도트 구문

class A(object): 
    def __init__(self, call_tree=None): 
     self.call_tree = call_tree 

    def __getattr__(self, val): 
     if self.call_tree: 
      new_call_tree = '.'.join([self.call_tree, val]) 
     else: 
      new_call_tree = val 
     return A(call_tree=new_call_tree) 

    def __call__(self, *args, **kwargs): 
     url = 'https://api.flickr.com/?function={}'.format(self.call_tree) 
     print url 

>>> b = A() 
>>> b.hi.mom() 
https://api.flickr.com/?function=hi.mom 
>>> b.hi.dad() 
https://api.flickr.com/?function=hi.dad 
+0

고마워. 그러나 : 나는 문서에서 주어진 전체 API 구조를 재 구축 할 필요가없는 방법을 찾고있다.작성할 코드 줄을 잃어 버리고 기본 API 호출이 언젠가는 바뀔 수 있으므로 숨겨진 방법 (인터페이스가 항상 불완전해질 수 있습니다) 때문에 생각했습니다. 바로 가기를 사용하지 않는 이유는 무엇입니까?) – user2888219

+0

그래서 문제는 "." 접근 자? 그것은 자기 복귀 수업을 통해 할 수 있습니다. 내 편집을 참조하십시오. – Meridius

0

이미 존재하는 파이썬에서 flickr apis로 실험 해 보셨습니까? 최소한

, 당신은 코드의 복사본을 체크 아웃하고 몇 가지 아이디어를 얻을 수 있습니다 : 여기

커플입니다.

+0

그래, 내가 그들 모두를 확인 처리. 그 중 일부는 매우 조용하지만 API 문서에 나열된 메소드의 구조를 내부적으로 다시 빌드하므로 매우 정적입니다. 예를 들면 : 1) "https://bitbucket.org/sybren/flickrapi/"에있는 인터페이스는 점을 "_"로 바꾸고 dict를 사용하여 모든 메소드 호출을 매핑합니다. 2)에서 "http://code.google.com/p/flickrpy/"클래스 구조는 파이썬 클래스에서 재 작성되며 이름은 API 문서에 제공된 메소드와 정확하게 일치해야합니다. 내가 필요로하지 않는 구조를 재건 할 필요없이 더 동적 인 방법을 찾고 싶다. – user2888219

+0

... 메소드가 http 요청으로 전달되었으므로 내부 구조가 필요 없다. 하지만 파이썬에서 함수를 호출하는 것과 동일한 구문을 사용하는 것이 좋을 것입니다. 너의 대답에 대해 – user2888219

관련 문제