python - 从文件中导入类方法作为python中的静态方法
问题描述
实际上,我找不到合适的话题。我正在尝试使用Apscheduler
图书馆。我为该库创建了一个类方法,并自己添加了一些缺少的功能作为一个全新的调度程序库。当SQLAlchemyJobStore
向调度程序使用添加的函数时,必须是可序列化的,但是当我创建一个新类时,添加的函数是类本身的成员。例如,假设这段代码:
from datetime import datetime
from time import sleep
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
class sched:
def __init__(self):
jobstores = {
'default': SQLAlchemyJobStore(url='sqlite:///test.db')
}
self.scheduler = BackgroundScheduler(jobstores=jobstores)
def add_func(self, some_func, args={}, kwargs={}):
self.scheduler.add_job(
some_func, 'interval', args=args, kwargs=kwargs, seconds=5, replace_existing=True)
def start(self):
self.scheduler.start()
def tick(self, i, j, **kwargs):
print("hello{} {}".format(i, j))
for k in kwargs:
print(k, ":", kwargs[k])
if __name__ == '__main__':
schedule = sched()
schedule.start()
schedule.add_func(schedule.tick, args=[1, 2], kwargs=dict(a=1, b=2))
# using the following three lines solve the problem
# sched = sched()
# sched.start()
# sched.add_func(sched.tick, args=[1, 2], kwargs=dict(a=1, b=2))
while True:
sleep(.1)
回溯(最后一次调用):文件“...\Python36\lib\site-packages\apscheduler\executors\base.py”,第 125 行,在 run_job retval = job.func(*job.args, **job .kwargs) 类型错误:tick() 缺少 1 个必需的位置参数:'j'
此错误意味着无法序列化整个类,但如果我将实例命名为与类名(此处sched
)相同,它将被修复。在示例中,该tick
函数必须是 schedule 类本身的成员,因为在我的原始类中,我scheduler.add_job
从类方法中获取了一个修改后的函数,而目前,我不想完全编辑我的新 schedule 类。
我的问题是当我想从文件中导入类时,会发生确切的问题。有没有其他方法可以从文件中导入类?
解决方案
该问题可以通过以下方式规避:
schedule.add_func(sched.tick, args=[schedule, 1, 2], kwargs=dict(a=1, b=2))
但是,这需要您将调度程序移出sched
类,因为它不能与sched
类的实例一起序列化。
推荐阅读
- php - 从 php 下载文件无法正常工作
- php - 为什么在 if 语句中使用 PHP 打印变量?
- php - 字符编码在
- c# - 我可以在 wpf 应用程序中使用网络核心库吗?
- java - 使用作为参数给出的比较器对对象列表进行排序的类方法(Java)
- c# - 无法访问客户端应用程序
- sql - 如果 ID 存在于另一个表中,则插入行
- nginx - 如何在 Nginx 上配置具有相同 URL 的多个站点
- reactjs - 将事件处理程序放在 NextJS _document 中——以及 NextJS 页面和 React SPA 之间的关系
- apache-flink - 如何在 Apache Flink 中创建外部目录表