Выбор из нескольких переменных

Я пытаюсь найти объекты на экране, посмотреть, существуют ли они, и если да, выберите их. Использование библиотеки Sikuli для запуска этой маленькой автоматизации.

while True:
    if exist("image/one.png", "image/two.png", "image/three.png"):
        click ("image/one.png", or "image/two.png", or "image/three.png")
    break

я получил SyntaxError: mismatched input 'or' expecting RPARENЯ сделал быстрый поиск, но ничего не нашел, относящийся к моей конкретной проблеме.

Я даже пытался

while True:
        if exist("image/one.png", or "image/two.png", or "image/three.png"):
            click ("image/one.png", or "image/two.png", or "image/three.png")
        break

И это приводит к той же ошибке.

@Stephan: новый фрагмент кода с ошибкой.

class gameImages():
    imageFiles = ["one.png", "two.png", "three,png"]

for imageFile in imageFiles:
    if exists(imageFile):
        click(imageFile)

Ошибка сейчас:

NameError: name 'imageFiles' is not defined

3 ответа

Решение
for imageFile in imageFiles:
  if exists(imageFile):
    click(imageFile)

Ваш while цикл ничего не делает, и ваш break заявление. Это может делать то, что вы хотите, если я понимаю, что вы хотите сделать.

Прочитав немного документации по Sikuli, я думаю, что это также может сделать то, что вы хотите.

for impath in ("image/one.png", "image/two.png", "image/three.png"):
    match = exists(impath)
    if match:
        click(match.getTarget())

Еще проще, это идеальное использование фильтра (ifexist,imageFiles). Вы тогда знаете, что все элементы>=0 в возвращении фильтра могут быть использованы:). И это более кратко и ясно выражает ваши намерения - гораздо приятнее читать, чем цепочку "за" и "если"

a = range(10)
# [1,2,3,4,5,6,7,8,9]

print filter(lambda x: x > 5, a)
# [6,7,8,9]

Также или является логическим оператором:

например

a = 5
b = 6
c = 5

if( (a==c) or (b==c) ):
    print 'c is repeated'

# c is repeated

использование вами или здесь не имеет смысла, поскольку у него нет операндов для работы - это могут быть даже два объекта, например

1 или 2, так как все может быть приведено к логическому

краткий способ сделать то, что вы хотите, это: //imagepaths = ваш список imagepaths

map(lambda x: click(x.getTarget()), filter(exists, imagepaths))
Другие вопросы по тегам