def _mkarg(self, kargs): """change the argument list (encode value, add api key/secret) :return: the new argument list""" kargs = kargs.copy() kargs['api_key'] = self._api.key kargs['api_secret'] = self._api.secret for k, v in list(kargs.items()): if isinstance(v, Iterable) and not isinstance(v, basestring): kargs[k] = ','.join(v) elif isinstance(v, File) or v is None: del kargs[k] elif isinstance(v, numeric_types): kargs[k] = str(v) else: kargs[k] = v return kargs
def __call__(self, *args, **kargs): if len(args): raise TypeError('Only keyword arguments are allowed') form = _MultiPartForm() for (k, v) in kargs.items(): if isinstance(v, File): form.add_file(k, v.get_filename(), v.content) url = self._urlbase for k, v in self._mkarg(kargs).items(): form.add_field(k, v) body = form.bytes request = Request(url, data=body) request.add_header('Content-type', form.get_content_type()) request.add_header('Content-length', str(len(body))) self._api.update_request(request) retry = self._api.max_retries while True: retry -= 1 try: ret = urlopen(request, timeout=self._api.timeout).read() break except HTTPError as e: raise APIError(e.code, url, e.read()) except (socket.error, URLError) as e: if retry < 0: raise e _print_debug('caught error: {}; retrying'.format(e)) time.sleep(self._api.retry_delay) if self._api.decode_result: try: # change due to compatibility problem with python 3.5 #print(str(ret)) ret = json.loads(ret.decode('utf-8'), object_hook=ObjectDict) except: raise APIError(-1, url, 'json decode error, value={0!r}'.format(ret)) return ret
def _print_debug(msg): if DEBUG_LEVEL: sys.stderr.write(str(msg) + '\n')