问题
我在Python 3.6中有以下列表
Piko = {}
Piko['Name']='Luke'
我正在尝试编写一个函数,该函数给出元素的值(如果它存在并设置),否则给出None
。
例如:
isset(Piko['Name'])
输出:Luke
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
?
答案 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'))