Python cursor\u factory=None引发异常

Python cursor\u factory=None引发异常,python,cursor,psycopg2,Python,Cursor,Psycopg2,我将我的psycopg2连接包装在DB类中,其中一个方法是获取游标。我还在其参数中添加了一个cursor\u factory,但是当使用None作为默认值时,会产生一个错误 class DB: ... connection code and other stuff ... def fetchcursor(self, query, params, in_cursor_factory=None): cur = self.conn.cursor(cursor_fac

我将我的
psycopg2
连接包装在
DB
类中,其中一个方法是获取游标。我还在其参数中添加了一个
cursor\u factory
,但是当使用
None
作为默认值时,会产生一个错误

class DB:

    ... connection code and other stuff ...

    def fetchcursor(self, query, params, in_cursor_factory=None):
        cur = self.conn.cursor(cursor_factory=in_cursor_factory)
        cur.execute(query, params)
        return cur

db = DB()
db.fetchcursor("SELECT * FROM foo", None)
我得到的错误是:

TypeError: 'NoneType' object is not callable
当我将
None
替换为
psycopg2.extras.DictCursor
时,它可以工作。我想使用
None
作为默认值,正如上面所说:


实际上,似乎无法很好地将
游标\u工厂
参数设置为
None

代码不会检查是否将
factory
设置为
Py_None
,并将其调用。如果未提供关键字参数
连接,则将使用游标工厂
,根据源代码,默认情况下,该工厂设置为
扩展名.cursor
(例如
psycopg2.\u psycopg.cursor

您可以通过测试
None
并使用
connection.cursor\u factory
进行复制,在这种情况下:

def fetchcursor(self, query, params, in_cursor_factory=None):
    if in_cursor_factory is None:
        in_cursor_factory = self.conn.cursor_factory
    cur = self.conn.cursor(cursor_factory=in_cursor_factory)
    cur.execute(query, params)
    return cur
这假定您使用的是
psycopg
2.5版或更高版本<代码>连接。光标\工厂


对于以前的版本,只需使用
psycopg2.\u psycopg.cursor
而不是
self.conn.cursor\u factory
AttributeError:“psycopg2.\u psycopg.connection”对象没有属性“cursor\u factory”
@BartFriederichs:这是
psycopg2
的哪个版本?源代码和两者都显示属性应该存在。@BartFriederichs:文档中确实说明了它是在版本2.5中引入的。@BartFriederichs:进一步研究,将
psycopg2.\u psycopg.cursor
替换为<2.5版本。正如Martijn指出的,这是psycopg的一个缺点。将其固定在2.5.3中。
def fetchcursor(self, query, params, in_cursor_factory=None):
    if in_cursor_factory is None:
        in_cursor_factory = self.conn.cursor_factory
    cur = self.conn.cursor(cursor_factory=in_cursor_factory)
    cur.execute(query, params)
    return cur