Comment puis-je déterminer la bonne `paramstyle " quand tout ce que j'ai est une `Connexion` objet?

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

  •  16-09-2019
  •  | 
  •  

Question

J'ai un exemple d'un Connection (nécessaire pour la base de données de l'API compatible 2.0), mais je n'ai pas le module à partir de laquelle il a été importé.Le problème est que je suis en train d'utiliser des paramètres nommés, mais je ne sais pas qui paramstyle pour l'utiliser.

Depuis paramstyle est un module de niveau constant, je ne peux pas il suffit de demander le Connection.J'ai essayé d'utiliser inspect.getmodule() sur mon Connection exemple, mais il revient tout juste None.Est-il un moyen plus facile que je suis juste en manque, ou ai-je besoin de faire quelques try/except code pour déterminer qui paramstyle à utiliser?

Était-ce utile?

La solution

Passer type(connection) (la classe de connexion) à inspect.getmodule(), pas l'objet de connexion.La classe des pistes le module qu'il a été défini dans la inspect pouvez trouver, alors que la création d'un objet n'est pas suivi.

Autres conseils

Où avez-vous l'instance de? Je ne peux 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 de la paramstyle ainsi.

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'

Cependant ça craint. Je ne compter sur elle pas même pour une seconde. J'utilise mes propres objets comme la connexion, et je voudrais passer un de ceux à votre bibliothèque. Je déteste quand il essaie de trouver comme par magie le paramstyle et échoue parce que je suis en utilisant un objet wrapper comme la connexion.

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 communs, il ne sera pas. (. Par exemple, la classe est définie dans un sous-module du boîtier qui agit comme l'objet module DB-API;. Ou la classe est une extension C sans __module__)

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top