2014-09-16 4 views
0

질문에서 올바른 용어를 사용했는지 확실하지 않습니다.** kwargs를 사용하는 동안 키워드를 강제로 사용하는 가장 좋은 방법은 무엇입니까?

현재 Google의 Blogger API (블로그 서비스)에서 래퍼/인터페이스를 만들려고합니다. [I가 이미 완료되었습니다,하지만 난 OOP/Python을 배울 수있는 프로젝트로이를 사용하고 알고 있습니다.] 나는 블로그에서 25 개 게시물의 세트를 얻는 방법 만든

:

def get_posts(self, **kwargs): 
    """ Makes an API request. Returns list of posts. """ 

    api_url = '/blogs/{id}/posts'.format(id=self.id) 
    return self._send_request(api_url, kwargs) 

def _send_request(self, url, parameters={}): 
    """ Sends an HTTP GET request to the Blogger API. 
     Returns JSON decoded response as a dict. """ 

    url = '{base}{url}?'.format(base=self.base, url=url) 

# Requests formats the parameters into the URL for me 
    try: 
     r = requests.get(url, params=parameters) 
    except: 
     print "** Could not reach url:\n", url 
     return 
    api_response = r.text 
    return self._jload(api_response) 

someblog = BloggerClient(url='http://someblog.blogger.com', key='0123') 
someblog.get_posts(key=self.key) 

모든 API 호출이 키가 URL에 매개 변수로 전송해야합니다 : 문제는

, 나는 API 키를 나는 get_posts 함수를 호출 할 때마다 지정해야합니다. 그런 다음 가장 좋은 방법은 무엇입니까?

나는 (?없는 가장 좋은 방법은 아마도하지만) 가능한 방법을 생각하고는 _send_request()에 kwargs로 사전에 키를 추가하는 것입니다

def _send_request(self, url, parameters={}): 
    """ Sends an HTTP get request to Blogger API. 
     Returns JSON decoded response. """ 
# Format the full API URL: 
    url = '{base}{url}?'.format(base=self.base, url=url) 

# The api key will be always be added: 
    parameters['key']= self.key 
    try: 
     r = requests.get(url, params=parameters) 
    except: 
     print "** Could not reach url:\n", url 
     return 
    api_response = r.text 
    return self._jload(api_response) 

정말 주위에 내 머리를 얻을 수 없다 가장 좋은 방법은 무엇입니까 (또는 대부분의 파이썬 방법)입니다. 문제는

답변

0

, 내가 API 키를 나는 get_posts 함수를 호출 할 때마다 지정해야합니다 : 그것은 정말이 하나의 방법 인 경우

을, 명백한 아이디어는 래퍼를 작성하는 것입니다 :

def get_posts(blog, *args, **kwargs): 
    returns blog.get_posts(*args, key=key, **kwargs) 

또는 더 나은, 당신을 위해 그것을 할 클래스를 마무리 :

class KeyRememberingBloggerClient(BloggerClient): 
    def __init__(self, *args, **kwargs): 
     self.key = kwargs.pop('key') 
     super(KeyRememberingBloggerClient, self).__init__(*args, **kwargs) 
    def get_posts(self, *args, **kwargs): 
     return super(KeyRememberingBloggerClient, self).get_posts(
      *args, key=self.key, **kwargs) 
그래서 지금 0

:

someblog = KeyRememberingBloggerClient(url='http://someblog.blogger.com', key='0123') 
someblog.get_posts() 

예, 무시하거나 다른 방법을 모두 사용하는 _send_request 방법을 monkeypatch하지만 고정 할 필요가 단 1 개 또는 2 개의 방법이 있다면, 왜 문서화되지 않은 내부 탐구 할 수 있습니다 그 클래스 중 하나의 바디를 포크로 만들어서, 당신이 그것을 깨끗하게하는 대신 명확하게 예상하지 못한 방식으로 변경할 수있게 할 수 있을까요?

물론 4 개의 다른 클래스에 90 개의 다른 메소드가 흩어져있는 경우 프로그래밍 방식으로이 래퍼를 빌드하고 클래스를 monkeypatching하는 방법을 고려하거나 개인적인 방법 중 하나만 패치하는 것이 좋습니다. 그것은 합리적으로 보인다.

1

명명 된 상수에 저장할 수 있습니다.

어딘가에 서버에서 호스팅 될 것 이상의 안전 할 필요가 있다면이 코드는

API_KEY = '1ih3f2ihf2f' 

단순히 보안이 필요하지 않는 경우, 당신은 환경 변수

의 값을 저장할 수 파이썬 스크립트에서 다음

export API_KEY='1ih3f2ihf2f' 

:

터미널에서

관련 문제