为了账号安全,请及时绑定邮箱和手机立即绑定

处理嵌套 if/else 和 while 的 Pythonic 方式

处理嵌套 if/else 和 while 的 Pythonic 方式

SMILET 2022-07-19 16:48:39
我有以下带有多个 if/else 和循环的 Python 代码。它正在成为一个意大利面条代码,如果可能的话,我想避免它。简而言之,我希望脚本在无人值守的情况下运行一段时间(几天/几周),但代码的真正“核心”应该只在上午 9 点到下午 5 点之间执行。代码可以进一步简化吗?shouldweContinue = Truewhile shouldweContinue:    today = dt.datetime.now()    if somefunction():        if today.time() >= dt.time(9,0):            instances = functionX()            shouldweContinueToday = True            cTime = dt.datetime.now()            if cTime <= dt.time(17,0):                for i in instances:                    print('something here')            else:                shouldweContinueToday = False        elif today.time() >= dt.time(17,0):            time.sleep(12 * 60 * 60) # sleep for 12 hours i.e. basically wait for tomorrow        else:            time.sleep(60) # sleep for 1 min to avoid non-stop looping    else:        raise SystemExit()
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

但代码的真正“核心”应该只在上午 9 点到下午 5 点之间执行。


然后测试那个,只有那个。将该测试放入一个在 9 到 17 之间才会返回的函数中:


def wait_for_working_hours():

    now = dt.datetime.now()

    if 9 <= now.hour < 17:

        return


    # not within working hours, sleep until next 9 o'clock

    next9_day = now.date()

    if now.hour >= 17:

        # between 17:00 and 23:59:59.999999, next 9am is tomorrow

        next9_day += dt.timedelta(days=1)

    delta = dt.datetime.combine(next9_day, dt.time(9)) - now

    time.sleep(delta.total_seconds())

此功能会一直阻塞到上午 9 点到下午 5 点之间。

其他要改变的事情:

  • 不要使用while flagvariable: ...,你可以使用break来结束一个while True:循环。

  • 我会使用sys.exit()而不是raise SystemExit().

  • 而不是if test: # do thingselse: exit,将退出条件放在前面,提早。因此if not test: exit,该# do things部分也不再需要缩进。

连同wait_for_working_hours看起来像这样的:

while True:

    if not some_function():

        sys.exit()


    wait_for_working_hours()


    # do things that need to be done during working hours

    # ...

    if some_condition:

        break


    # then sleep for a minute before doing it again.

    time.sleep(60)


查看完整回答
反对 回复 2022-07-19
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信