2

我有一个 a 的实例Connection(符合 DB API 2.0 的要求),但我没有从中导入它的模块。问题是我正在尝试使用命名参数,但我不知道该paramstyle使用哪个。

由于paramstyle是模块级常量,我不能只问Connection. 我尝试inspect.getmodule()在我的Connection实例上使用,但它刚刚返回None. 有没有一种我只是想念的更简单的方法,还是我需要做一些try/except代码来确定paramstyle使用哪个?

4

3 回答 3

2

你从哪里得到的实例?我无法想象您不会事先知道连接来源的情况。如果您的图书馆的用户正在向您传递连接,请向他询问 paramstyle。

无论如何,请查看以下控制台会话:

>>> import sqlite3
>>> c = sqlite3.connect('/tmp/test.db')
>>> c
<sqlite3.Connection object at 0xb7db2320>
>>> type(c)
<type 'sqlite3.Connection'>
>>> type(c).__module__
'sqlite3'
>>> import sys
>>> sys.modules[type(c).__module__].paramstyle
'qmark'

然而,这很糟糕。我一秒钟都不会依赖它。我使用自己的类似连接的对象,我想将其中一个传递给您的库。当它试图神奇地找出 paramstyle 并失败时,我会讨厌它,因为我正在使用类似连接的包装器对象。

于 2009-09-24T12:22:11.223 回答
2

type(connection)将(连接类)传递给inspect.getmodule(),而不是连接对象。该类跟踪它定义的模块以便inspect可以找到它,而对象创建不被跟踪。

于 2009-09-24T12:24:34.363 回答
2

你不能。

您可以通过查看来尝试connection.__class__.__module__,但 DB-API 并未指定它会起作用。事实上,对于许多常见情况,它不会。(例如,该类在充当 DB-API 模块对象的包的子模块中定义;或者该类是没有 . 的 C 扩展__module__。)

不幸的是,您必须将 DB-API 模块对象的引用与 DB-API 连接对象一起传递。

于 2009-09-24T12:37:57.090 回答