有没有更短的方法可以在每行代码之前检查条件而不重复条件?

问题描述

我正在尝试使用pyautogui进行故障保护。有时必须将鼠标光标移到角落是非常困难的。以下是此键绑定处于活动状态时我的代码应该执行的示例。它可以工作,但是我想看看是否有更好的方式编写此代码,而不必每次都重复每个条件。我希望能够在循环期间的任何时间执行故障保护,而不必等到每次迭代的开始。

这是我希望我的代码执行的操作:

import pyautogui
import sys
from win32.lib.win32con import VK_CAPITAL
from win32.win32api import GetKeyState

def check():
    if GetKeyState(VK_CAPITAL) == 1:
        sys.exit()

for i in range(10):
    check()
    pyautogui.move(100,200,duration=1)
    check()
    pyautogui.move(200,300,duration=1)
    check()

这是现在的样子:

import pyautogui
import sys
from win32.lib.win32con import VK_CAPITAL
from win32.win32api import GetKeyState

def check():
    if GetKeyState(VK_CAPITAL) == 1:
        sys.exit()

for i in range(10):
    check()
    pyautogui.move(100,duration=1)
    pyautogui.move(200,duration=1)

解决方法

建立可调用操作的列表,并在检查条件时迭代该列表。以下将调用功能列表,直到大写锁定键处于活动状态:

import sys
import time
from win32.lib.win32con import VK_CAPITAL
from win32.win32api import GetKeyState

def check():
    if GetKeyState(VK_CAPITAL) == 1:
        print('exiting...')
        sys.exit()

def move(x,y,duration):
    print(f'move to {x},{y}')
    time.sleep(duration)

funcs = (lambda: move(100,200,duration=1),lambda: move(200,300,duration=1))

while True:
    for func in funcs:
        check()
        func()
,

一种不同的方法,

def func1():
   print('func1')
def func2():
   print('func1')
def func3():
   print('func1')

funcs_map['cond1'] = func1
funcs_map['cond2'] = func2
funcs_map['cond3'] = func3

def get_condition(i:int) -> str:
    if(i == 1):
       return 'cond1'
    elif(i == 2):
       return 'cond2'
    else:
       raise ValueError(f'Unknown i value: {i} to get a condition')


for i in range(x):
   func_ptr = funcs_map[get_condition(i)]
   func_ptr()