首页 > 解决方案 > 从文件中导入类方法作为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 类。

我的问题是当我想从文件中导入类时,会发生确切的问题。有没有其他方法可以从文件中导入类?

标签: pythonapscheduler

解决方案


该问题可以通过以下方式规避:

schedule.add_func(sched.tick, args=[schedule, 1, 2], kwargs=dict(a=1, b=2))

但是,这需要您将调度程序移出sched类,因为它不能与sched类的实例一起序列化。


推荐阅读