Mam słownik taki jak klasa, którego używam do przechowywania niektórych wartości jako atrybutów. Ostatnio dodałem trochę logiki (__getattr__
), aby zwrócić Brak, jeśli atrybut nie istnieje. Jak tylko to zrobiłem, marynata rozbił się i chciałem się dowiedzieć, dlaczego?Awaria Pythona podczas próby przywrócenia wartości domyślnej w __getattr__
Code Test:
import cPickle
class DictionaryLike(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __iter__(self):
return iter(self.__dict__)
def __getitem__(self, key):
if(self.__dict__.has_key(key)):
return self.__dict__[key]
else:
return None
''' This is the culprit...'''
def __getattr__(self, key):
print 'Retreiving Value ' , key
return self.__getitem__(key)
class SomeClass(object):
def __init__(self, kwargs={}):
self.args = DictionaryLike(**kwargs)
someClass = SomeClass()
content = cPickle.dumps(someClass,-1)
print content
Wynik:
Retreiving Value __getnewargs__
Traceback (most recent call last):
File <<file>> line 29, in <module>
content = cPickle.dumps(someClass,-1)
TypeError: 'NoneType' object is not callable`
zrobiłem coś głupiego? Czytałem posta, że deepcopy() może wymagać, aby rzucić wyjątek, jeśli klucz nie istnieje? Jeśli tak, to czy istnieje łatwy sposób osiągnięcia tego, co chcę, bez rzucania wyjątku?
Wynik końcowy jest, że jeśli niektóre połączenia
someClass.args.i_dont_exist
chcę go zwrócić None.
Myślę, że to może być najlepsze dla mojej sprawy, ponieważ _ i \ _ \ _ nigdy nie będą nazwami atrybutów. – Nix
To jest naprawdę sprytne Nigdy nie myślałem, że to zrobię – GWW
dude, że tak bardzo mnie tu uratowałeś – Greg