2015-08-08 73 views
3

我需要遍历列表并执行一些操作(比如说对于sum)。每当它得到一个NameError时,它应该跳过该变量并返回剩余的结果集。在迭代期间忽略NameError

a = 1 
b = 2 
c = 3 

try: 
    z = sum([a, b, c, d]) 
except NameError as e: 
    pass 
else: 
    print(z) 

我还没有宣布d这里,所以异常被捕获时,它应该只是跳过d和计算剩余的结果。这个怎么做?

Expected result = 6 

注:我已经命名为A,B,C,D的明确理解但在实际情况下,列表不同填充。

+0

的'sum'。 – hjpotter92

+6

这是一个很难回答的问题,不知道你真的想做什么。在这种情况下,NameError发生在列表被构造之前,所以你不能拿出总和。你如何结束未定义的名称? – mgilson

+0

我想计算一个像SUM(A1:A5)的excel公式,如果A4没有定义,我只需要跳过并计算其他。 – PyAn

回答

2

看到你是如何结束了不确定的变数将有很大的帮助,但一个方法是解析回溯得到未定义的变量名称,并给它的默认值0:

def f(): 
    a = 1 
    b = 2 
    c = 3 
    while True: 
     try: 
      z = sum([a, b, c, d]) 
      break 
     except NameError as e: 
      name = e.message.split()[1].strip("'") 
      exec "{} = {}".format(name, 0) 
    return z 

print(f()) 

对于Python 3,Exec将无法正常工作,所以你将不得不名称添加到全局:一旦`NameError`升高,不计算

def f(): 
    a = 1 
    b = 2 
    c = 3 
    while True: 
     try: 
      z = sum([a, b, c, d]) 
      break 
     except NameError as e: 
      name = str(e).split()[1].strip("'") 
      globals()[name] = 0 
    return z 
4

NameError被提出时,sum函数将不会完成。 这是解决这个问题的一种方法。这是一种奇怪的方法,但由于你有特殊的情况,这可能会有所帮助。

a = 1 
b = 2 
c = 3 

def checkExists(variable): 
    return variable in locals() or variable in globals() 

toCheck = [] 

# Check all the variables as strings to see if they exist 
for var in ["a", "b", "c", "d"]: 
    # If they do, add them to the 'check' list 
    if checkExists(var): 
     toCheck.append(eval(var)) 

print(sum(toCheck))