如何在Python中优雅地控制用户问题流?



我正在用Python编写软件,需要做以下工作:

  1. 通过获取用户的输入给变量赋值
  2. 根据用户之前的答案选择要问的下一个问题
  3. 一旦所有问题都被问完,就根据变量采取行动

我在这里看到了一个例子,它在Python字典中设置问题,并根据输入的答案跳转到哪个问题。这是非常简洁和容易遵循的,所以我开始实现它。接下来,我将把变量与第二个字典进行比较,这个字典将决定采取什么行动——我相信这被称为决策矩阵。

然而,在一个询问日期的问题上,我停了下来。我不知道如何检查日期的格式是否正确,以及如何让Python检查已输入的有效日期,如果有,则移动到下一个特定的问题。结果发现这个问题不止一次出现。

代码如下:在有关的问题中,您可以很容易地看到候选人frequency1frequency2我在那里吃了个大亏。

我想,问题是我是否可以使用字典来定义问题和流程,或者我是否必须接受它并创建一堆IF语句。我开始使用字典的唯一原因是使它易于实现、维护和扩展。一旦我确定了这一点,我需要实现更大的问题集,所以我希望问题流尽可能优雅和简单。

为混淆了问题而道歉。

如果你回答,我只想指出这是我第一次尝试用Python写东西,而不是问别人的名字并打印出来,这样更简单对我来说更好!谢谢!

#Stopquestions is a dictionary containing all the questions that could be asked of the user. It also controls the flow of the questions.
stopquestions = {
'stopconfirm':
{
'prompt':'Do you want to take this action? Y/N ',
'Y':'prev',
'N':'genericerror'
},
'prev':
{
'prompt':'Previously done? Y/N ',
'Y':'bamerch',
'N':'frequency1'
},
'bamerch':
{
'prompt':'Was that with B or M? B/M ',
'B':'candate',
'M':'candate'
},
'candate':
{
'prompt':'What was the date? DD/MM/YYYY ',
'DD/MM/YYYY':'length',
'Anything but the above':'genericerror'
},
'length':
{
'prompt':'Yes or no with reference to length? Y/N ',
'Y':'frequency2',
'N':'frequency2'
},
'frequency1':
{
'prompt':'Choose freq? W/F/M/Q/A ',
'W/F/M/Q/A':'dis',
'Anything but the above':'genericerror'
},
'frequency2':
{
'prompt':'Choose freq? W/F/M/Q/A ',
'W/F/M/Q/A':'end',
'Anything but the above':'genericerror'
},
'dis':
{
'prompt':'Disagreement with recent? Y/N ',
'Y':'end',
'N':'end'
},
'genericerror':
{
'text':'This is a basic example of how we can catch errors.',
'action':'end'
}
}

我会查看日期,如果与格式不匹配,则要求用户重新输入数据。
arrow是处理这个问题的一个很好的工具:

import arrow
try:
arrow.get('01/01/2021', 'MM/DD/YYYY')
except arrow.parser.ParserMatchError:
print(False)

https://arrow.readthedocs.io/en/latest/

更新

def check_format(date, fmt='MM/DD/YYYY'):
try:
x = arrow.get(date)
return x.format('MM/DD/YYYY')
except (arrow.parser.ParserMatchError, arrow.parser.ParserError):
if fmt: # 'MM/DD/YYYY'
try:
x = arrow.get(date, fmt)
return x.format('MM/DD/YYYY')
except arrow.parser.ParserMatchError:
return False
return False
print(check_format('2021-01-01')) # 01/01/2021
print(check_format('2021-01-01', 'MM/DD/YYYY')) # 01/01/2021
print(check_format('01/01/2021', 'MM/DD/YYYY')) # 01/01/2021
print(check_format('June was born in May 10 1980', 'MMMM D YYYY'))) # 05/10/1980
print(check_format('01/2021', 'MM/DD/YYYY')) # False     

相关内容

  • 没有找到相关文章

最新更新