如何验证 apschedular 用户传递的参数(cron 样式)?

How to validate apschedular user passed arguments (cron-style)?

我想使用 apscheduler 来安排 python 代码的执行,并让用户能够指定他想要的代码执行日期或时间,我已经使用 getopt 模块。

我如何检查用户传递的参数是否匹配用于 cron 样式计划的表达式类型(*、*/a、a-b、a-b/c、xth y、last x、last、x ,y,z)... 因为我的代码还有很多其他的功能;如果用户在执行其余代码之前输入了无效表达式,我想引发错误 ... 例如:如果用户输入 --minute hello 程序应该在提示用户被问到一些问题之前引发错误...

我尝试使用 apscheduler/triggers/cron 目录下的 BaseField class,但是如果用户输入了有效的表达式,BaseField 不会引发错误,我可能会以错误的方式使用它!,但这是我尝试做的:

import apscheduler.triggers.cron as f
f.BaseField('day','1')          <<< Good: Doesn't raise an Error
f.BaseField('day','1,2')        <<< Good: Doesn't raise an Error
f.BaseField('day','1-3')        <<< Good: Doesn't raise an Error
f.BaseField('day','1,2,3')      <<< Good: Doesn't raise an Error
f.BaseField('day','hello')      <<< Good: Does rais an Error
f.BaseField('day','2th 7')      <<< Not Good: Does raise an Error
f.BaseField('day','last mon')   <<< Not Good: Does raise an Error

我也尝试使用下面的模式,并尝试将其与用户输入的内容相匹配,但是如果用户已经通过 "last" 或 [=37,下面的模式对我不起作用=]...(我不擅长正则表达式)

Pattern = '(?P<first>\d+)(?:-(?P<last>\d+))?(?:/(?P<step>\d+))?$'
re.search(Pattern , passed_arguemtn , re.IGNORECASE)

请指导我:

1- 我如何检查传递的参数。

2- getopt 是否带有 --year --month --week 等选项看起来不错,或者我应该检查另一种计时格式,如 YYYYMMDD 和 HHMMSS,这种格式是否适用于 cron 风格的表达式。

谢谢

您的方法是正确的,但您需要使用 BaseField 个用于验证的子类,(当前)已列出 here:

from apscheduler.triggers.cron import fields

try:
    fields.DayOfMonthField('day', 32)
except ValueError as e:
    print(e)

您还可以解析完整的 cron 表达式:

from apscheduler.triggers.cron import CronTrigger

try:
    CronTrigger.from_crontab('61 * * * *')
except ValueError as e:
    print(e)

根据您的要求和用户,这两种方法都可以正常工作。 使用crontab表达式更容易实现和使用 对于高级用户。单独处理每个字段可能更容易 用于某些用户,您也许可以创建一个 UI 小部件,例如组合框,而不仅仅是行编辑。