Source code for bencoding.encoder

from collections import OrderedDict
from .tokens import *


[docs]class EncoderError(Exception): pass
[docs]class Encoder: """Use to encode data(str, bytes, int, list, dict).""" def __init__(self, data): self.data = data
[docs] def encode(self): """Return bytes of self data.""" return self._encode(self.data)
def _encode(self, data): if isinstance(data, str): return self._encode_string(data) elif isinstance(data, bytes): return self._encode_bytes(data) elif isinstance(data, int): return self._encode_int(data) elif isinstance(data, list): return self._encode_list(data) elif isinstance(data, (dict, OrderedDict)): return self._encode_dict(data) else: raise EncoderError('unsupported this type:{}'.format(type(data))) def _encode_string(self, data): return (str(len(data))).encode() + TOKEN_STRING_SEPARATOR + data.encode() def _encode_bytes(self, data): return (str(len(data))).encode() + TOKEN_STRING_SEPARATOR + data def _encode_int(self, data): return TOKEN_INTEGER + str(data).encode() + TOKEN_END def _encode_list(self, data): return TOKEN_LIST + b''.join([self._encode(item) for item in data]) + TOKEN_END def _encode_dict(self, data): return TOKEN_DICT + b''.join([self._encode(k) + self._encode(v) for k, v in data.items()]) + TOKEN_END