以下是我的代码:
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行的提示,但随意批评其余部分。
答案 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)
并设置日志记录级别。