Как мне определить правильный стиль параметра, если у меня есть только объект Connection?

StackOverflow https://stackoverflow.com/questions/1471304

  •  16-09-2019
  •  | 
  •  

Вопрос

У меня есть экземпляр Connection (требуется для совместимости с DB API 2.0), но у меня нет модуля, из которого он был импортирован.Проблема в том, что я пытаюсь использовать именованные параметры, но не знаю, какие именно. paramstyle использовать.

С paramstyle является константой уровня модуля, я не могу просто спросить Connection.Я попробовал использовать inspect.getmodule() на моем Connection экземпляр, но он только что вернулся None.Есть ли более простой способ, который мне просто не хватает, или мне нужно будет что-то сделать try/except код, чтобы определить, какой paramstyle использовать?

Это было полезно?

Решение

Проходить type(connection) (класс соединения) до inspect.getmodule(), а не объект соединения.Класс отслеживает модуль, в котором он был определен, поэтому inspect может его найти, при этом создание объекта не отслеживается.

Другие советы

Откуда вы взяли экземпляр?Я не могу представить ситуацию, когда вы не будете заранее знать источник соединения.Если пользователь вашей библиотеки передает вам соединение, спросите у него также стиль параметра.

В любом случае, посмотрите на следующий сеанс консоли:

>>> 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'

Однако это отстой.Я бы не стал на это полагаться ни на секунду.Я использую свои собственные объекты, подобные соединениям, и хотел бы передать один из них в вашу библиотеку.Я бы не хотел, чтобы он магическим образом пытался узнать стиль параметра и терпел неудачу, потому что я использую объект-оболочку, похожую на соединение.

Вы не можете.

Вы можете попробовать, посмотрев connection.__class__.__module__, но в DB-API не указано, что это будет работать.На самом деле во многих распространенных случаях это не так.(например.класс определен в подмодуле пакета, который действует как объект модуля DB-API;или класс является расширением C без __module__.)

К сожалению, вам придется передать ссылку на объект модуля DB-API вместе с объектом подключения DB-API.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top