如何检查函数是否正在尝试访问不存在的内容?

时间:2016-11-12 16:32:17

标签: python return nonetype

我正在使用python,我有这个功能:

c=15
def glteme(imgt):
    for a in range(0,80):            
        for b in range(0,80):
            if (imgt[a,b,0]==0 and imgt[a,b,1]==0 and imgt[a,b,2]==0):
                c=1
                return a,b,c

(我正在处理80x80的图像,在这2个for循环中,我正在浏览图像的每个像素并尝试找到第一个黑色像素)。所以,在这个if condition我正在检查是否像素图像是黑色的,如果是,则glteme(imgt)应返回a,b,c。然后,我尝试在代码中使用c访问glteme(imgt)[2]

if glteme(imgt)[2]==1:
   ...

当函数返回a,b,c时,它可以访问c,但我不知道如何检查函数是否可以访问不存在的c ?(如果在上面的函数中,代码永远不会进入c条件,那么if并不存在)我尝试了if glteme(imgt)[2]==Falseif glteme(imgt)[2] is not True等等,但它是&#39 ; s不工作..(我收到错误'NoneType' object has no attribute '__getitem__')提前谢谢!

3 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你的问题是在图像中没有黑色像素时检测条件。在放置函数时,在这种情况下不会返回任何返回值。

更改函数以返回监护人返回值,表示未找到黑色像素,并在返回时检查:

c=15
def glteme(imgt):
    for a in range(0,80):            
        for b in range(0,80):
            if (imgt[a,b,0]==0 and imgt[a,b,1]==0 and imgt[a,b,2]==0):
                c=1
                return a,b,c
    return None  # This tells to the caller no result was found

稍后调用此函数时,请检查None并采取相应措施:

res = glteme(imgt)

if res is None:
    # ... no black pixel was found
else:
    # ... do whatever with res, it will contain a, b, c

答案 1 :(得分:0)

你可以捕捉到这些例外情况,而且它通常是一种很好的做法而不是测试,如果'返回的值是可用的:

try :
    a = glteme(imgt)[0]
    b = glteme(imgt)[1]
    c = glteme(imgt)[2]
    # do what you want with a,b,c
    print(a, b, c)
except AttributeError as e:
    # this is where you don't get a,b and c
    print('no result')

答案 2 :(得分:0)

try / except块优于if / else。 这个概念被称为“请求宽恕而非许可”

  

Python社区使用EAFP(更容易请求宽恕而不是   许可)编码风格。这种编码风格假设需要   存在变量,文件等。任何问题都被视为例外。   这导致通常清洁和简洁的风格包含很多   尝试和除了陈述。