Angenommen, wir versuchen, ein nicht vorhandenes Attribut zuzugreifen:Wie hält das Objekt erhalten ein Attribut fehlt
>>> {'foo': 'bar'}.gte('foo') # well, I meant “get”!
Pythons AttributeError
hat nur das Attribut args
mit einem String der fertige Fehlermeldung enthält: 'dict' object has no attribute 'gte'
Verwenden Sie die Module inspect
und/oder traceback
mit sys.last_traceback
, gibt es eine Möglichkeit, das tatsächliche dict-Objekt zu erhalten?
>>> offending_object = get_attributeerror_obj(sys.last_traceback)
>>> dir(offending_object)
[...
'clear',
'copy',
'fromkeys',
'get', # ah, here it is!
'items',
...]
Edit: da die Katze aus dem Sack ist sowieso, werde ich meine Erkenntnisse und Code teilen (bitte nicht dieses lösen und zu PyPI, bitte unterbreiten;)
) Die AttributeError
wird erstellt here, die zeigt, dass es eindeutig keinen Verweis auf das ursprüngliche Objekt gibt.
Hier ist der Code mit der gleichen Platzhalter-Funktion:
import sys
import re
import difflib
AE_MSG_RE = re.compile(r"'(\w+)' object has no attribute '(\w+)'")
def get_attributeerror_obj(tb):
???
old_hook = sys.excepthook
def did_you_mean_hook(type, exc, tb):
old_hook(type, exc, tb)
if type is AttributeError:
match = AE_MSG_RE.match(exc.args[0])
sook = match.group(2)
raising_obj = get_attributeerror_obj(tb)
matches = difflib.get_close_matches(sook, dir(raising_obj))
if matches:
print('\n\nDid you mean?', matches[0], file=sys.stderr)
sys.excepthook = did_you_mean_hook
Willst du etwas sagen wie den Entwickler fragen "meintest du statt GTE"? – karthikr
Versuchen, Ruby zu replizieren [hattest du ...] (http://www.yukinishijima.net/2014/10/21/did-you-mean-experience-in-ruby.html) Funktionalität, wie? :-) – Kevin
@Kevin: das wäre ein tolles Paket auf PyPI! [DidYouMean] (https://pypi.python.org/pypi/DidYouMean/) existiert, es geht aber um Rechtschreibprüfung, nicht um Code. – ojdo