更多pythonic方式来嵌套函数

时间:2016-09-06 04:47:51

标签: python python-2.7 easygui

以下是我的代码:

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)

如果用户无意中关闭了一个盒子,是否有一种更加pythonic的方式来递归提问?主要是寻找最后4行的提示,但随意批评其余部分。

2 个答案:

答案 0 :(得分: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中勾画出来,也被称为" Python的禅宗。"遗憾的是,没有工具来判断对这些更深层原则的遵守情况。需要经验。

答案 1 :(得分:0)

我认为这比使用sentinel变量更加惯用:

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

另外,请考虑使用logging模块进行调试打印,因此您只需if __debug__: print(whatever)而不是logging.debug(whatever)并设置日志记录级别。