Conosci un modo semplice per trovare una chiamata di registrazione che genera "non abbastanza argumenst per la stringa di formato". Sulla mia stazione di lavoro ho modificato logging/__init__.py
per stampare il messaggio in modo da poter trovare facilmente la riga nella sorgente.Un modo semplice per trovare "non abbastanza argomenti ..." nella libreria di registrazione python
Ma avete qualche idea su cosa fare nell'ambiente di test in cui non è possibile modificare la libreria standard di Python né eseguire facilmente pdb?
Nota: Il traceback non ha senso ed è in scala dalla libreria di registrazione. Ecco un traceback:
File "/usr/lib/python2.6/logging/handlers.py", line 71, in emit
if self.shouldRollover(record):
File "/usr/lib/python2.6/logging/handlers.py", line 144, in shouldRollover
msg = "%s\n" % self.format(record)
File "/usr/lib/python2.6/logging/__init__.py", line 648, in format
return fmt.format(record)
File "/usr/lib/python2.6/logging/__init__.py", line 436, in format
record.message = record.getMessage()
File "/usr/lib/python2.6/logging/__init__.py", line 306, in getMessage
msg = msg % self.args
TypeError: not enough arguments for format string
E qui è il codice nella libreria standard che cattura l'errore
try:
if self.shouldRollover(record):
self.doRollover()
logging.FileHandler.emit(self, record)
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
soluzione come suggerito da Alex: ho avvolto il getMessage per stampare il msg e args. Ecco il codice:
def print_log_record_on_error(func):
def wrap(self, *args, **kwargs):
try:
return func(self, *args, **kwargs)
except:
import sys
print >>sys.stderr, "Unable to create log message msg=%r, args=%r " % (
getattr(self, 'msg', '?'), getattr(self, 'args', '?'))
raise
return wrap
import logging
logging.LogRecord.getMessage = print_log_record_on_error(logging.LogRecord.getMessage)
Grazie per aver chiesto questa domanda e la soluzione di invio. Quando ho affrontato "TypeError: non ci sono abbastanza argomenti per la stringa di formato" nella quarta volta ho iniziato a cercare un modo intelligente per rilevare queste cose. Il tuo post è stato trovato uno nella prima schermata dei risultati di ricerca di Google. Penso che il modulo di registrazione dovrebbe essere aggiornato per gestire questa eccezione e fornire informazioni su dove nel codice utente si verifica questo problema. – vvladymyrov
@vvladymyrov Benvenuto. Grazie per avermi fatto sapere che il codice è stato utile per ou. –