2016-09-06 4 views
2

Вот код, у меня есть:Более вещий способ гнездовых функций

def reallyquit(): 
     from easygui import boolbox 
     if __debug__: print ("realy quit?") 
     answer = boolbox("Are you sure you want to Quit?") 
     if answer == 1: 
      sys.exit() 
     return 

columns = ['adr1','adr2','spam','spam', 'spam'] 

Street = choicebox("Street Address?", title, columns) 
    while Street == None: 
     reallyquit() 
     Street = choicebox("Street Address?", title, columns) 

Есть ли более вещий способ рекурсивно задать вопрос, если пользователь закрывает окно неосторожно? В основном ищут советы на последних 4 строках, но не стесняйтесь критиковать остальных.

+0

Я не вижу рекурсии. – sberry

+0

Существует много непифонических аспектов вашего форматирования, и использование '== None:' также не является pythonic (используйте 'is None:' вместо этого). Пожалуйста, рассмотрите возможность проверки источника с помощью 'pep8' или' flake8'. Или прямо запускайте 'yapf' на источнике. – Anthon

+1

Немного общих указателей: 1. Не импортируйте внутри функции, если это не требуется (что редко, но это происходит), сохраните свой импорт в верхней части файла. 2. Вам не нужно «возвращать» в конце функции 'reallyquit', поскольку функции Python возвращают None по умолчанию. 3. Отступ (и проверьте форматирование) вашего кода на SO. 4. Что сказал @ Энтон. – sberry

ответ

2
import sys 
from easygui import boolbox, choicebox 

def reallyquit(): 
    "Ask if the user wants to quit. If so, exit." 
    if __debug__: 
     print("really quit?") 
    answer = boolbox("Are you sure you want to Quit?") 
    if answer == 1: 
     sys.exit() 

columns = ['adr1', 'adr2', 'spam', 'spam'] 
street = None 

# ask for address until given or user decides to quit 
while street is None: 
    street = choicebox("Street Address?", title, columns) 
    if street is None: 
     reallyquit() 

В основной логики: Обычно вы бы не проверить, если значение равно None, так как это синглтон (только один в системе, и все вхождения None являются одной и той же логической None). Таким образом, is None - лучший тест. Я также использовал немного более форматирование кода Pythonic (пробелы после запятых в списке, имена переменных нижнего регистра) и порядок тестирования, который не дублирует вызов взаимодействия с пользователем.

Альтернативная форма предложенная Eric будет что-то вроде:

while True: 
    street = choicebox("Street Address?", title, columns) 
    if street is not None: 
     break 
    reallyquit() 

Это имеет силу не повторять тест street is None, но немного длиннее. Ваше предпочтение, для которого вариант кажется более четким и логичным, может отличаться.

Для подготовки: Импорт осуществляется из функций, а choicebox импортируется там, где он ранее отсутствовал. Функция задается определяющей строкой комментария. Выполняется одно утверждение для каждого стандартного стандарта. И ненужный return удален.

Это еще довольно грубая программа, но теперь она «более Pythonic».

Не должно быть подавляющим, но стандартом для внешнего вида Pythonic является PEP 8. Существуют такие инструменты, как pep8, которые вы можете установить для проверки соответствия. Более глубокая или «семантическая» часть Pythonic-кода выложена в PEP 20, также известном как «Zen of Python». К сожалению, нет никакого средства судить о соблюдении этих более глубоких принципов. Требуется опыт.

+0

@XiaojunChen, если не был принят фальшивый ответ, например '0 ',' [] ',' {} ',' "" 'и т. д. ... – sberry

+1

просто заметьте, что ваш отступ последней строки 'reallyquit()' равно 3, должен быть 4 –

+0

Повторение условия 'street is None 'здесь невелик - возможно, просто сделайте' while True' и добавьте разрыв в if? Это рекомендуемый способ эмуляции инструкции 'do while' в python – Eric

0

Я думаю, что это более идиоматическое, чем при использовании переменного дозорный:

while True: 
    street = choicebox("Street Address?", title, columns) 
    if street is None: 
     reallyquit() 
    else: 
     break 

Кроме того, рассмотреть вопрос об использовании logging модуля для отладки печати, поэтому вместо if __debug__: print(whatever) вы просто logging.debug(whatever) и установить уровень журналирования.

+0

Спасибо. Я добавил перерыв. – chthonicdaemon