Примените один и тот же формат к нескольким строковым переменным

#python #python-3.x

Вопрос:

Я пишу меню. Будут заполнены варианты 1,2 и 3 project . Варианты 4, 5 и 6 зависят от значения project . Я хочу вычеркнуть варианты 4,5 и 6, если project == None .

 project = None
menuOptions = {0 : 'Option4', 1 : 'Option5', 2 : 'Option6'}

print("""
Choose:

━━━━━━━━━━━━ Text ━━━━━━━━━━━━
1 : Option1 
2 : Option2
3 : Option3

━━━━━━━━━━━━ Text ━━━━━━━━━━━━
4 : {0}

━━━━━━━━━━━━ Text ━━━━━━━━━━━━
5 : {1}

━━━━━━━━━━━━ Text ━━━━━━━━━━━━
6 : {2}     

    
0 : Exit""".format('u0336'.join(menuOptions[0])   'u0336' if project == None else menuOptions[0],
                   'u0336'.join(menuOptions[1])   'u0336' if project == None else menuOptions[1],
                   'u0336'.join(menuOptions[2])   'u0336' if project == None else menuOptions[2]))
 

Приведенный выше код работает нормально, но мне интересно, есть ли способ сократить необходимый код, следуя этой идее:

 format( 
    for opt in menuOptions: 
        'u0336'.join(menuOptions[opt])   'u0336' if project == None else menuOptions[opt]
)
 

Цель состоит в том, чтобы иметь возможность добавлять новые элементы в меню, отображать их в меню и применять то же форматирование без необходимости «жестко» его кодировать.

Ответ №1:

Вы можете использовать звездное понимание здесь:

 """...""".format(*('u0336'.join(opt)   'u0336' if project is None else opt
                   for opt in menuOptions))
 

Комментарии:

1. Работает так, как задумывалось, просто пришлось сменить .join(opt) с .join(menuOptions[opt]) . Спасибо, я не знал о распаковке аргументов.

Ответ №2:

Так что не уверен, что это то, что вы хотели, но вы можете немного уменьшить «жесткую запись», сделав это:

 # list comprehension to get format options 
# (you can use a loop here instead for more readability if needed)
x = ['u0336'.join(menuOptions[opt])   'u0336' if project == None else menuOptions[opt] for opt in menuOptions]

print("""
Choose:

━━━━━━━━━━━━ Text ━━━━━━━━━━━━
1 : Option1 
2 : Option2
3 : Option3

━━━━━━━━━━━━ Text ━━━━━━━━━━━━
4 : {0}

━━━━━━━━━━━━ Text ━━━━━━━━━━━━
5 : {1}

━━━━━━━━━━━━ Text ━━━━━━━━━━━━
6 : {2} 

    
0 : Exit""".format(*x))

 

* Оператор распаковывает список для вас.