我有一个GUI,我要求用户输入一些值。当用户提交数据时,我做了一些验证:
尽量不要重复自己,我想出了这个,但验证的第二部分看起来更像是一个黑客。是否有更多的pythonic重写方式,而不是像验证的第一部分那样拼写所有内容?
errors = []
# 1) check if values exist
if not self.startInput.GetValue():
errors.append("Please provide a start")
if not self.stopInput.GetValue():
errors.append("Please provide a stop")
if not self.valueInput.GetValue():
errors.append("Please provide a value")
# 2) check if values are integers
try:
self.start = int(self.startInput.GetValue())
self.stop = int(self.stopInput.GetValue())
self.value = int(self.valueInput.GetValue())
except ValueError as err:
tb = traceback.format_exc()
func = re.search('self\.(.*) =', tb).groups()[0]
errors.append("Value for {0} needs to be an integer.".format(func))
if errors:
raise RuntimeError('\n'.join(errors))
答案 0 :(得分:4)
由于您正在检查整数而不是浮点数,因此您可以执行以下操作:
if self.start.GetValue().strip().isdigit():
pass
对于输入为空字符串且输入包含非数字的两种情况, isdigit()
都会返回False
。
如果您想为错误分配发送特定错误:
startValue = self.start.GetValue().strip()
if not startValue:
errors.append("Please provide a start.")
if not startValue.isdigit():
errors.append("Value of start must be an integer.")
答案 1 :(得分:1)
我认为try: ... except
完全是Pythonic。我会使用辅助函数而不是搜索错误消息get_int_of_name(name, value, error)
,如果需要,它会返回一个int并更新错误:
def get_int_of_name(name, value, error):
try:
res = int(value)
except ValueError:
error.append("...")
return 0
else:
return res
答案 2 :(得分:1)
如果您在名为inputs
的词典中有这些输入,则可以执行以下操作:
errors = []
for inputname, inputval in self.inputs.items():
if not inputval:
errors.append("Please provide a {}".format(inputname))
try:
setattr(self, inputname, int(inputval.GetValue()))
except:
errors.append("Value for {0} needs to be an integer.".format(inputname))
if errors:
raise RuntimeError('\n'.join(errors))