我在psycopg2
类中包含了DB
连接,其中一种方法是获取游标。我还在其参数中添加了cursor_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
作为默认值,就像documentation所说的那样:
cursor(name=None, cursor_factory=None, scrollable=None, withhold=False)
答案 0 :(得分:1)
事实上,似乎connection.cursor()
implementation无法处理cursor_factory
参数设置为None
。
代码不会检查factory
是否设置为Py_None
并且无论如何都要调用它。如果没有给出关键字参数,则使用connection.cursor_factory
代替,根据来源,默认设置为extensions.cursor
(例如psycopg2._psycopg.cursor
)。
您可以通过测试None
并在这种情况下使用connection.cursor_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或更新版本; connection.cursor_factory
was added in that version。
对于以前的版本,只需使用psycopg2._psycopg.cursor
代替self.conn.cursor_factory
。