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

时间:2017-03-21 14:02:15

标签: python cron expression options apscheduler

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

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

我尝试在apscheduler / triggers / cron目录下使用BaseField类,但如果用户输入了有效的表达式,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

我也尝试使用下面的模式,并尝试将其与用户输入的内容相匹配,但如果用户已经过了&#34; last&#34;以下模式对我不起作用。或者&#34;最后一个&#34; ...(我在正则表达式方面不擅长)

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

请指导我:

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

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

由于

1 个答案:

答案 0 :(得分:0)

您的方法是正确的,但是您需要使用 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 小部件,例如组合框,而不仅仅是行编辑。