列表文字和列表理解行为不同

时间:2019-05-26 13:31:15

标签: python python-3.x pdb

我在Python 3.7中遇到了一个非常奇怪的问题。具体来说,我有一个函数,它获取文档ID的列表,并返回它们对应的Wikipedia文档。奇怪的是,如果我按需传递列表理解,它不会返回任何内容,但是如果传递具有完全相同的值的列表文字,它将以某种方式起作用。请注意,这是使用pdb的,在交互式提示中,键入interact时它将打开:

如果我运行列表理解功能,则会得到以下列表:

>>> [x[0] for x in truncated]
[3553957, 4480571, 4686346, 1955046, 4476254, 4510002, 3941950, 2991560, 5314256, 3949007]

如果我使用此列表文字运行查询,则它可以正常工作(为简洁起见,数据被截断):

>>> self._db.query_ids([3553957, 4480571, 4686346, 1955046, 4476254, 4510002, 3941950, 2991560, 5314256, 3949007])
[(1955046, 'Hairy_nightshade', 'Hairy nightshade is a common name for...')]

但是,如果我将这两个表达式组合在一起,它将不会返回任何内容:

>>> self._db.query_ids([x[0] for x in truncated])
[]

被调用的实际函数没有副作用,它仅查询数据库,因此在调用之间不会发生任何改变:

def query_ids(self, ids):
    """
    Returns the tokens for each document with the given ID
    """
    result = self.conn.execute(
        'SELECT doc_id, document, group_concat(tokens, " ") FROM doc WHERE doc_id in ({}) GROUP BY doc_id'.format(
            ', '.join(['?'] * len(ids))), ids)
    data = result.fetchall()
    return data

这怎么可能?


如果我在print(ids)函数的第一行添加一个query_ids,则ID列表两次打印相同,但是仍然不能用于列表理解:

(Pdb) self._db.query_ids([x[0] for x in truncated])
[3553957, 4480571, 4686346, 1955046, 4476254, 4510002, 3941950, 2991560, 5314256, 3949007]
[]
(Pdb) self._db.query_ids([3553957, 4480571, 4686346, 1955046, 4476254, 4510002, 3941950, 2991560, 5314256, 3949007])
[3553957, 4480571, 4686346, 1955046, 4476254, 4510002, 3941950, 2991560, 5314256, 3949007]
[(1955046, 'Hairy_nightshade', 'Hairy nightshade is a common name for several plants and may refer to...')]

1 个答案:

答案 0 :(得分:2)

这是一个奇怪的错误,但是我相信我已经解决了。

问题不是truncated的类型,它是一个列表,但是该列表的内容是numpy int64类型,不是 python整数:

(Pdb) !a = [x[0] for x in truncated]
(Pdb) type(a)
<class 'list'>
(Pdb) type(a[0])
<class 'numpy.int64'>

当此numpy.int64列表传递到数据库查询时,它们被忽略,因为Python sqlite3 API不知道如何处理非本地Python类型:https://docs.python.org/3/library/sqlite3.html#using-adapters-to-store-additional-python-types-in-sqlite-databases

  

因此,可以将以下Python类型毫无问题地发送到SQLite:无,整型,浮点型,str,字节

因此,当我将数据转换为原生Python整数时,它起作用了:

(Pdb) self._db.query_ids([int(x[0]) for x in truncated])
[3553957, 4480571, 4686346, 1955046, 4476254, 4510002, 3941950, 2991560, 5314256, 3949007]
[(1955046, 'Hairy_nightshade', 'Hairy nightshade is a common name for several plants and may refer to ')]