Try/except 如果列表的元素存在
Try/except if an element of a list exists
问题
我在 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
?
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'))
问题
我在 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
?
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'))