这很容易成为我在一段时间内遇到的最奇怪的错误。让我给你一个我正在使用的代码片段。这段代码访问了一些Django apis,但这些对于正在发生的事情并不是特别重要(我希望)。
def handle_location(self):
zip_code_location = Location.objects.filter(zip_code=self.cleaned_data.get('zip_code'))
if not zip_code_location:
raise forms.ValidationError('Invalid zip code returned.', code='invalid_zip_code')
else:
zip_code_location = zip_code_location[0]
city, state = map(lambda x: x.strip().lower(), self.cleaned_data.get('location_raw').split(','))
try:
city_state_location = map_citystate_to_location(city, state)
except LocationMatchingException as e:
logging.error(e.msg + 'location_raw: {} and zip_code: {}'.format(self.cleaned_data.get('location'),
self.cleaned_data('zip_code'),
exc_info=True, stack_info=True))
raise forms.ValidationError('Something is wrong with that location!', code='invalid_location')
# Compare these by zip code. We don't have an __eq__ operator overloaded
if city_state_location.zip_code != zip_code_location.zip_code:
logging.error('The zipcode returned from the client mapped to a different location than the raw city and'
'state returned from the client. \n'
'location_raw: {} \n'
'location matched with zip_code: {} \n'
'location matched with city and state: {}'.format(self.cleaned_data.get('location'),
zip_code_location,
city_state_location,
exc_info=True, stack_info=True))
forms.ValidationError('Something is wrong with that location!', code='invalid_location')
self.cleaned_data['location'] = zip_code_location
我们在一开始创建一个名为zip_code_location的变量,并为其指定一个Location对象。 Location对象是一个相当简单的类,它继承了Django.db.models.model的形式。就Django而言,它没有做任何与众不同的事情。无论如何,我们将zip_code_location存储在名为cleaning_data的字典中,并继续我们的快乐方式。
函数handle_location由名为clean的函数调用。通常,如果我从clean中检查cleaning_data的值,它看起来像这样:
{'start_time': datetime.time(1, 57), 'location_raw': 'Manhattan bch, CA', 'start_date': datetime.date(2014, 10, 28), 'payment_method': 'G', 'zip_code': '90266', 'price': 2324.0, 'title': 'asdsadds', 'location': <Location: manhattan beach, ca 90266 -- lat: 33.88 long: -118.40 -- population 30505>, 'start_datetime': datetime.datetime(2014, 10, 28, 8, 57, tzinfo=<UTC>), 'type': 'T'}
请注意,该位置在那里。我找到了一个特定的位置,但事实并非如此。键/值对存在于self.cleaned_data中,因为程序离开handle_location但随后在我们点击return语句并向上移动堆栈时完全消失。有没有搞错????它几乎就像垃圾收集器一样,决定不再有对zip_code_location指向的原始实例的引用,并决定将其清理干净。但显然情况并非如此。任何人都知道发生了什么?为什么它可能适用于某些输入?
感谢您的任何见解
尼克
编辑:我错了。当我们上堆栈时,键/值对不会消失,它首先永远不会被分配给self.cleaned_data。当我逐步调试调试器中的代码并检查clean_data的值时,读取&#34; return,&#34;它不包含&#34;位置&#34;键。是否有一个Set属性导致dict拒绝我的输入?