垃圾收集和引用计数

时间:2014-10-28 06:10:32

标签: python

这很容易成为我在一段时间内遇到的最奇怪的错误。让我给你一个我正在使用的代码片段。这段代码访问了一些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拒绝我的输入?

0 个答案:

没有答案