Python 8行代码实现input询问键盘输入超时自动跳过选择默认值

在编写Python程序时,经常需要设置临时选择项,如出现异常时询问后续操作,或程序开始执行时询问必要参数等,这时候往往需要用到input或弹窗等方式向用户询问。然而,当程序并不是自己用,或者需要分享给他人的时候,出于稳健性的考虑,我们可能需要为此类输入命令设置超时时间,如询问选择后若5秒内未得到返回值,就选择默认参数,并继续执行后续进程。

然而,通过一段时间的搜索,网上提供了不少超时终止的方法,如采取多线程的方法,或使用包eventlet,或者使用signal。经过测试,发现其各自都有一些问题。

  • 对于使用threading创建多线程的方法来说,实现方法较为复杂,需要编写装饰器,而且若要获取返回值还需要为Thread撰写子类来实现,而这里只是需要实现一个简单的超时跳过,大可不必如此大动干戈。
  • 对于使用eventlet方法实现超时的方法,介绍的文章大部分都是针对爬虫或大量计算的情况,经过测试发现该方法对input无效,对于input来说无论超时多久都不会自动跳过
  • 对于使用signal的方法,只有Linux\MacOS平台下可用,Windows无法使用

本文通过调用一个简单的库实现装饰器,能够通过短短8行代码,实现获取input询问输入,并计时超时后自动抛出异常或设置默认参数继续执行后续进程。

首先pip install func_timeout包,将需要询问的内容封装进一个函数,并为其添加func_set_timeout(2)的装饰器,参数2表示超时时间,此处设置为2s。

import func_timeout

@func_timeout.func_set_timeout(2)
def askChoice():
    return input('yes or no:')

try:
    s = askChoice()
except func_timeout.exceptions.FunctionTimedOut as e:
    s = 'f'
print(s)

程序执行时先调用askChoice函数,并开始计时,若用户在计时期间内输入,则正常传参,若用户超时,则触发func_timeout.exceptions.FunctionTimedOut异常,try...except捕捉异常,并进行后续操作。

此方法对于多线程中的子线程内的超时问题也能提供很好的处理,有兴趣的同学可以尝试一下,欢迎讨论~

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值