2012-07-29 39 views
1

我有Python中的函数,它在一根绳子上的错误检查。如果函数发现错误,它将返回一个包含错误代码和该错误标识符的元组。在程序的后面,我有处理错误的功能。它接受元组为两个变量。元组在缺失值

errCode, i = check_string(s,pathType) 

check_string是产生元组的函数。如果没有错误,我希望它做的只是返回零。当返回零时,上面的代码似乎失败了,因为变量i没有任何内容。

有没有一种简单的方法来得到这个工作,或者我只需要程序返回一个0和0的元组,如果没有发现错误?

回答

3

我会为此使用异常系统。

class StringError(Exception): 
    NO_E = 0 
    HAS_Z = 1 

def string_checker(string): 
    if 'e' not in string: 
     raise StringError('e not found in string', StringError.NO_E) 
    if 'z' in string: 
     raise StringError('z not allowed in string', StringError.HAS_Z) 
    return string.upper() 

s = 'testing' 
try: 
    ret = string_checker(s) 
    print 'String was okay:', ret 
except StringError as e: 
    print 'String not okay with an error code of', e.args[1] 
+1

也许我没有得到这个问题,但是这一切只需检查元组是否包含一个或两个值? *不是*意味着批评,显然使用异常机制有其地位(EAFP),但似乎比必要的更复杂。 – Levon 2012-07-29 10:52:52

+1

@Levon返回错误值相当于C-ish而不是非常Pythonic。也许我在这两行之间读了太多内容,但考虑到OP的第一段,我的第一个想法是“使用异常” - 在这种情况下,'string_checker'返回一个有效的字符串(不使用元组和代码),否则引发,可以在任何需要的地方进行处理......对我来说似乎只是一种“更清洁”的设计。 – 2012-07-29 10:58:44

+0

欣赏反馈,我看到你的推理,谢谢。 – Levon 2012-07-29 11:00:12

1

为什么不只是试图检索值前检查数组的长度是多少?

err_tup = check_String(s, pathType) 
if len(err_tup) == 2: 
    errCode, i = err_tup 
else: # assuming it can only be 1 otherwise 
    errCode = err_tup 

这将工作,而不会对生成元组的其余代码进行任何更改,并且语义清晰。

基于“简单胜过复杂”。

1

您可以使用无作为值误差

def check_string(s,pathType): 
    # No error 
    return (None, i) 
0

如果你要返回零:

foo = func() 
if not foo: 
    print 'No errors' 
else: 
    # foo is tuple