code: def encode(cls, value):
          
          val_encoding = 'utf-8'
  
          def encode_str(v):
              try:
                  v_enc = encode(v, val_encoding)
  
              except UnicodeDecodeError:
                  if PY3:
                      raise
                  else:
                      # Suppose bytestring
                      v_enc = v
  
              prefix = encode('%s:' % len(v_enc), val_encoding)
              return prefix + v_enc
  
          def encode_(val):
              if isinstance(val, str_type):
                  result = encode_str(val)
  
              elif isinstance(val, int_types):
                  result = encode(('i%se' % val), val_encoding)
  
              elif isinstance(val, (list, set, tuple)):
                  result = encode('l', val_encoding)
                  for item in val:
                      result += encode_(item)
                  result += encode('e', val_encoding)
  
              elif isinstance(val, dict):
                  result = encode('d', val_encoding)
  
                  # Dictionaries are expected to be sorted by key.
                  for k, v in OrderedDict(sorted(val.items(), key=itemgetter(0))).items():
                      result += (encode_str(k) + encode_(v))
  
                  result += encode('e', val_encoding)
  
              elif isinstance(val, byte_types):
                  result = encode('%s:' % len(val), val_encoding)
                  result += val
  
              else:
                  raise BencodeEncodingError('Unable to encode `%s` %s' % (type(val), val))
  
              return result
  
          return encode_(value)
docs: Encodes a value into bencoded bytes.
  
          :param value: Python object to be encoded (str, int, list, dict).
          :param str val_encoding: Encoding used by strings in a given object.
          :rtype: bytes