Il messaggio di errore indica esattamente cosa non va. L'interprete Python deve conoscere la codifica del carattere non ASCII.
Se vuoi restituire U + 00A3 , puoi dirlo
return u'\u00a3'
che rappresenta questo personaggio in puro ASCII mediante una sequenza di escape Unicode. Se vuoi restituire una stringa di byte contenente il byte letterale 0xA3, questo è
return b'\xa3'
(dove in Python 2 b
è implicito; ma esplicito è meglio di implicito).
Il PEP collegato nel messaggio di errore indica esattamente come dire a Python "questo file non è puro ASCII; ecco la codifica che sto usando". Se la codifica è UTF-8, sarebbe
# coding=utf-8
o compatibile con Emacs
# -*- encoding: utf-8 -*-
Se non sai quale codifica viene utilizzata dal tuo editor per salvare questo file, esaminalo con qualcosa come un editor esadecimale e qualche googling. Stack Overflowcodifica dei caratteritag ha una pagina di informazioni tag con ulteriori informazioni e alcuni suggerimenti per la risoluzione dei problemi.
In così tante parole, al di fuori dell'intervallo ASCII a 7 bit (0x00-0x7F), Python non può e non deve indovinare quale stringa rappresenta una sequenza di byte. https://tripleee.github.io/8bit#a3 mostra 21 possibili interpretazioni per il byte 0xA3 e questo è solo dalle codifiche legacy a 8 bit; ma potrebbe anche essere il primo byte di una codifica multi-byte. Ma in effetti, immagino che tu stia effettivamente usando Latin-1, quindi dovresti
# coding: latin-1
come prima o seconda riga del file sorgente. Ad ogni modo, senza la conoscenza di quale personaggio dovrebbe rappresentare il byte, neanche un essere umano potrebbe indovinarlo.
Un avvertimento: coding: latin-1
rimuoverà sicuramente il messaggio di errore (perché non ci sono sequenze di byte che non sono tecnicamente consentite in questa codifica), ma potrebbe produrre un risultato completamente sbagliato quando il codice viene interpretato se la codifica effettiva è qualcos'altro. Devi davvero conoscere la codifica del file con assoluta certezza quando dichiari la codifica.