2009-09-24 4 views
2

je une instance d'un Connection (nécessaire à l'API DB 2.0 compatible), mais je n'ai pas le module à partir duquel il a été importé. Le problème est que j'essaie d'utiliser des paramètres nommés, mais je ne sais pas quel paramstyle utiliser.Comment est-ce que je détermine le `paramstyle` approprié quand tout ce que j'ai est un objet` Connection`?

Depuis paramstyle est une constante de niveau du module, je ne peux pas demander simplement le Connection. J'ai essayé d'utiliser inspect.getmodule() sur mon instance Connection, mais il vient de renvoyer None. Y at-il un moyen plus facile que je manque juste, ou vais-je besoin de faire un code try/except pour déterminer quels paramstyle à utiliser?

Répondre

2

col type(connection) (classe de connexion) à inspect.getmodule(), pas objet de connexion. La classe suit le module dans lequel elle a été définie, donc inspect peut le trouver, tandis que la création d'objet n'est pas suivie.

2

Où avez-vous obtenu l'instance de? Je ne peux pas imaginer une situation où vous ne saurez pas à l'avance la source de la connexion. Si l'utilisateur de votre bibliothèque vous passe une connexion, demandez-lui également le paramstyle.

Quoi qu'il en soit, regardez la session de console suivante:

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

Quoi qu'il aspire. Je ne compterais pas dessus même pas une seconde. J'utilise mes propres objets de type connexion, et j'aimerais en passer un à votre bibliothèque. Je détesterais quand il essaie de découvrir le paramstyle comme par magie et échoue parce que j'utilise un objet wrapper de type connexion.

2

Vous ne pouvez pas.

Vous pouvez essayer en regardant connection.__class__.__module__, mais pas spécifié par DB-API que ça va fonctionner. En fait, pour de nombreux cas courants, ce ne sera pas le cas. (. Par exemple, la classe est définie dans un sous-module du paquet qui agit comme l'objet du module DB-API, ou la classe est une extension C sans __module__.)

Il est regrettable, mais vous devrez passer un référence à l'objet de module DB-API autour de l'objet de connexion DB-API.

Questions connexes