#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))
*
Оператор распаковывает список для вас.