Onde está:
data = {k: v for k, v in locals().iteritems() if not v in (self, None)}
estava a obter uma falha que fazia com que data estivesse sempre vazia. Um debug rápido fez-me perceber que locals() estava a sofrer alterações (em stdin) durante a iteração o que provocava erro.
A solução é guardar os locals numa variável antes de iterar:
localvars = copy.deepcopy(locals())
data = {k: v for k, v in localvars.iteritems() if not v in (self, None)}
Após essa alteração já não tinha problemas a gerar o conteúdo de data, mas agora obtinha erro quando em make_request tentava obter o dump JSON de data. A excepção que ocorria dizia que UnBabel API não é um objecto serializável em JSON. Investigando descobri que data tinha como um dos seus dados self (apesar do if acima). Então voltei a alterar a linha acima para:
localvars = copy.deepcopy(locals())
data = {k: v for k, v in localvars.iteritems() if not v in (self, None) and not k == 'self'}
Agora data já é serializado em JSON e os dados enviados ao servidor com sucesso