文件scheduling.py
当前不包含任何内容。它需要包含什么内容,因此最后一条语句cursor.chronology()
打印Hello World
?我确实希望此方法可用于通过sqlite.connect()
定义的任何事物。
import sqlite3
import scheduling
db = sqlite3.connect(':memory:')
cursor = db.cursor()
cursor.chronology()
答案 0 :(得分:2)
sqlite3.connect()
和sqlite3.onnection.cursor()
方法均允许您指定np.apply_along_axis
参数,以使用自己的子类替换常规连接或游标类。您可以使用这些路径来提供自己的factory
方法。
因此,您可以将cursor.chronology()
类子类化以添加您的自定义方法:
sqlite3.Cursor
然后可以将该类用作import sqlite3
class ChronologyCursor(sqlite3.Cursor):
def chronology(self):
print("Hello World")
# ...
调用的factory
参数:
cursor()
您还可以使用连接工厂(子类>>> db = sqlite3.connect(':memory:')
>>> cursor = db.cursor(factory=ChronologyCursor)
>>> type(cursor)
<class '__main__.ChronologyCursor'>
>>> cursor.chronology()
Hello World
)来始终使用光标类:
sqlite3.connection()
然后使用class ChronologyConnection(sqlite3.Connection):
def cursor(self, *args, **kwargs):
if kwargs.get('factory') is None:
kwargs['factory'] = ChronologyCursor
return super().cursor(*args, **kwargs)
使用新的连接类:
db = sqlite3.connect(':memory:', factory=ChronologyConnection)
我强烈建议反对修补>>> db = sqlite3.connect(':memory:', factory=ChronologyConnection)
>>> type(db)
<class '__main__.ChronologyConnection'>
>>> cursor = db.cursor()
>>> cursor.chronology()
Hello World
函数,使上述工厂成为默认设置,但是如果您必须具有透明性,则可以将sqlite3.connect()
模块上的connect()
函数。基本软件包是纯Python,因此您可以 将其中的替代sqlite3
函数添加到猴子中。
因此,在您的connect()
模块中,您将放置上述类,然后使用:
scheduling
现在导入_sqlite3_connect = sqlite3.connect
def chronology_connect(*args, **kwargs):
if kwargs.get('factory') is None:
kwargs['factory'] = ChronologyConnection
return _sqlite3_connect(*args, **kwargs)
sqlite3.connect = chronology_connect
就足以使用备用连接工厂调用scheduling
了:
sqlite3.connect()
您不想要执行上述操作的原因是,它使>>> import sqlite3
>>> import scheduling
>>> db = sqlite3.connect(':memory:')
>>> cursor = db.cursor()
>>> cursor.chronology()
Hello World
>>> type(db)
<class 'scheduling.ChronologyConnection'>
>>> type(cursor)
<class 'scheduling.ChronologyCursor'>
调用偏离规范,并以与文档说明的方式冲突的方式进行操作。从长远来看,这会使您的代码难以维护。我会坚持使用明确的sqlite3.connect()
通话。