Try/except 如果列表的元素存在

Try/except if an element of a list exists

问题

我在 Python 3.6

中有以下列表
Piko = {}
Piko['Name']='Luke'

我正在尝试编写一个函数,如果元素存在且已设置,则给出该元素的值,否则给出 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?

Piko.get('Surname')

Piko.get('Surname', None)

与 return None 相同,因为“姓氏”不在您的字典中。

为了将来参考,您可以通过键入以下内容从 Python shell(例如 ipython)中快速找到它:

In[4]: help(Piku.get)

产生:

Help on built-in function get:

get(...)

D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.

异常甚至在它进入您的 isset 函数之前就已经发生了。当你这样做时:

isset(Piko['Name'])

... 基本上和这样做是一样的:

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

无论您在 isset 中放入什么代码,都无济于事,因为永远不会调用该函数。唯一可以放置异常处理的地方是上一层,在调用 isset.

的函数中

或者,您可以不尝试查找 dict[key] 以传递到 isset,而是将字典和密钥作为单独的参数传递:

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'))