Python 奇怪的 [n 个字符] 编码错误?

标签 python django python-3.x encoding

我有一个看似愚蠢且简单的错误,但对于我的一生,我无法弄清楚为什么这不起作用。在我的测试中,当我比较两个字典时,我得到这个错误:

Traceback (most recent call last):
  File "/path/to_my_app/tests/test_unit.py", line 120, in test_destroy_data
    self.assertEqual(obsolete_data, expected_obsolete_data)
AssertionError: {'cou[45 chars]es': {<Category: Test Category>}, 'beers': {<Beer: Test Beer>}} != {'cou[45 chars]es': {<Category: Test Category>}, 'beers': {<Beer: Test Beer>}}
  {'beers': {<Beer: Test Beer>},
   'categories': {<Category: Test Category>},
   'countries': {<Country: Test Country>}}

Django 2.0、Python 3.5

我的方法:

def destroy_data(self):
    """
    Remove entries not in the csv file.
    """
    obsolete_data = {
        'beers': set(Beer.objects.all()) ^ set(self.beer_list),
        'categories': set(Category.objects.all()) ^ set(self.category_list),
        'countries': set(Country.objects.all()) ^ set(self.country_list),
    }

    for data in obsolete_data:
        [obj.delete() for obj in obsolete_data[data]]

    return obsolete_data

我的测试:

def test_destroy_data(self):
    """
    Remove old entries.
    """
    self.importer.import_data(destroy=False)
    obsolete_data = self.importer.destroy_data()
    expected_obsolete_data = {
        'countries': {self.country},
        'categories': {self.category},
        'beers': {self.beer},
    }
    self.assertEqual(obsolete_data, expected_obsolete_data)

当我在调试器中检查这两个值时,它们是相同的,或者至少它们以这种方式打印出来。我试过用 unicode 编写 key ,但我得到了同样的错误。为什么会弹出这个[45 chars]

更新

我在使用 self.assertDictEqual 时将 maxDiff 设置为 None,我确实得到了整个错误输出,但错误保持不变:

Traceback (most recent call last):
  File "/path/to_my_app/tests/test_unit.py", line 124, in test_destroy_data
    self.assertDictEqual(obsolete_data, expected_obsolete_data)
AssertionError: {'cat[35 chars]>}, 'beers': {<Beer: Test Beer>}, 'countries':[22 chars]ry>}} != {'cat[35 chars]>}, 'countries': {<Country: Test Country>}, 'b[22 chars]er>}}
  {'beers': {<Beer: Test Beer>},
   'categories': {<Category: Test Category>},
   'countries': {<Country: Test Country>}}

最佳答案

经过一番调试后,我发现了问题所在。我从数据库中删除了这些实例,但它们仍在内存中。因此,当我将它们与返回数据进行比较时,它们是不同的对象,即使它们包含相同的数据(除了一个 instance.id 为 None,另一个为 1)。 所以我不得不手动测试特定的属性:

self.importer.import_data(destroy=False)
obsolete_data = self.importer.destroy_data()
expected_obsolete_data = {
    'countries': [self.country, ],
    'categories': [self.category, ],
    'beers': [self.beer, ],
}

self.assertEqual(
    obsolete_data['countries'][0].name,
    expected_obsolete_data['countries'][0].name
)
self.assertEqual(
    obsolete_data['categories'][0].name,
    expected_obsolete_data['categories'][0].name
)
self.assertEqual(
    obsolete_data['beers'][0].name,
    expected_obsolete_data['beers'][0].name
)

关于Python 奇怪的 [n 个字符] 编码错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49508413/

相关文章:

python - 查找一个数据框中每行的前 n 个值,并使用这些索引获取另一个数据框中的值以执行成对操作

python - 如何使用 Django 发送 iCalendar 电子邮件附件?

python - 使用 Python Windows 获取 CPU 和 GPU 温度

python - 关闭并打开另一个窗口

python - 如何像 JavaScript 一样在 Python 中包装函数?

python - django 和 Python 代码中的多处理

python - 计算 Pandas 列上的滚动窗口加权平均值

Python多重继承,从公共(public)子类初始化

python : Generating a gzip string by returning chunks

django - 当您将项目上传到托管服务时,mysql 如何与 django 一起工作?