내가 가진 것이 '연결'객체 일 때 적절한 '매개 변수'를 어떻게 결정합니까?
-
16-09-2019 - |
문제
나는 a의 인스턴스가 있습니다 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 모듈 객체에 대한 참조를 전달해야합니다.