Динамическое построение булевского выражения

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

Наивная версия:

prefix = 'hello0' while os.path.exists(prefix + '.abc') or os.path.exists(prefix + '.def') or os.path.exists(prefix + '.ghi'): n = int(prefix[-1]) prefix = prefix[:-1] + str(n + 1) # I know this doesn't work when n reaches two digits; my full code involves a regular expression 

Условие, очевидно, может стать очень длинным и уродливым, когда есть несколько расширений. Я отвлек это на цикл for .

Моя версия:

 prefix = 'hello0' extensions = ('.abc', '.def', '.ghi') # there could be even more than this condition = True while condition: condition = False # if any of the paths still exist, set the condition back to True for extension in extensions: if os.path.exists(prefix + extension): condition = True n = int(prefix[-1]) prefix = prefix[:-1] + str(n + 1) 

Я все еще чувствую, что это немного неуклюже: не совсем ясно, что цикл while на самом деле тестирует. Возможно ли построить булевое выражение динамически, а не устанавливать логическое значение ?

Я думаю, что следующее могло бы работать (я не проверял его, я думал об этом только при написании этого!), Но я не думаю, что мне придется прибегать к eval :

 prefix = 'hello0' extensions = ('.abc', '.def', '.ghi') test = 'False' for extension in extensions: test += " or os.path.exists(prefix + '" + extension + "')" while eval(test): n = int(prefix[-1]) prefix = prefix[:-1] + str(n + 1) 

    Возможно, вы захотите использовать any() встроенный с генератором:

     while any(os.path.exists(prefix + extension) for extension in extensions): # then increment prefix and try again, as in your example code 

    Это вычисляет True или False которые вам нужны, с более простым синтаксисом.

    В общем, если я когда-либо испытываю соблазн использовать eval() на динамическом языке, таком как Python, то это означает, что есть важная языковая функция, о которой мне нужно узнать. Предполагается, что динамические языки делают код красивым без бедствия, пытаясь написать и сохранить код-то-write-more-code, поэтому вы сделали именно то, что нужно здесь, спросив о вашем подходе.