如果列表的元素存在,请尝试/ except

时间:2018-03-15 21:12:50

标签: python python-3.x list function try-except

问题

我在Python 3.6中有以下列表

Piko = {}
Piko['Name']='Luke'

我正在尝试编写一个函数,该函数给出元素的值(如果它存在并设置),否则给出None。 例如:

  • INPUT:isset(Piko['Name'])输出:Luke
  • INPUT:isset(Piko['Surname'])输出:None

我尝试了什么

第一次尝试;基于我的诀窍:

def isset1(x):
    try:
        x
    except KeyError:
        print(None)
    else:
        print(x)
第二次尝试;基于this回答:

def isset2(x):
    try:
        t=x
    except IndexError:
        print(None)
第三次尝试;基于this回答:

def isset3(x):
    try:
        x
    except Exception:
        print(None)
    else:
        print(x)

之前的任何一个都给了我KeyError: 'Surname'错误,并没有按我的意愿输出None。任何人都可以帮我解释如何正确管理KeyError

2 个答案:

答案 0 :(得分:4)

Piko.get('Surname')

Piko.get('Surname', None)

是相同的并返回None,因为" Surname"不在你的字典里。

为了将来参考,您可以通过键入:

从Python shell(例如ipython)快速发现这一点
  

在[4]中:帮助(Piku.get)

产生:

  

有关内置函数get的帮助:

     

的get(...)

     

D.get(k [,d]) - >如果k在D中则为D [k],否则为d。 d默认为None。

答案 1 :(得分:3)

在它进入isset函数之前发生异常。当你这样做时:

isset(Piko['Name'])

......这与这样做基本相同:

_tmp = Piko['Name']
isset(_tmp)

无论你在isset内放置什么代码,它都没有帮助,因为该函数永远不会被调用。在调用isset的函数中,唯一可以将异常处理放在一个级别的位置。

或者,您也不能尝试查找dict[key]以传递到isset,并将dict和密钥作为单独的参数传递:

def isset(d, key):
    try:
        print(d[key])
    except KeyError:
        print(None)

但在这一点上,你只是以笨拙的方式复制dict.get。你可以这样做:

def isset(d, key):
    print(d.get(key, None))

...或者只是废弃isset并执行此操作:

print(Piko.get('Name', None))

或者,如果您没有指定任何内容,None是默认值:

print(Piko.get('Name'))