Python TypeError:尽管调用了TypeError异常,但仍返回了NoneType
我正在嵌套字典中搜索键和返回值。我使用多个例外行设置了每个搜索,如下所示:Python TypeError:尽管调用了TypeError异常,但仍返回了NoneType,python,typeerror,Python,Typeerror,我正在嵌套字典中搜索键和返回值。我使用多个例外行设置了每个搜索,如下所示: try: accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory'] except (KeyError, TypeError) as e: accounts_category = '' line = H + '|' + vn_id + '|' + sn_id + '|' + supplier_name + '\
try:
accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory']
except (KeyError, TypeError) as e:
accounts_category = ''
line = H + '|' + vn_id + '|' + sn_id + '|' + supplier_name + '\n'
完成搜索后,我将组合字符串和管道分隔符,如下所示:
try:
accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory']
except (KeyError, TypeError) as e:
accounts_category = ''
line = H + '|' + vn_id + '|' + sn_id + '|' + supplier_name + '\n'
然而,当我尝试组合变量时,我得到了一个TypeError
TypeError: coercing to Unicode: need string or buffer, NoneType found
如果我添加if
语句,我的脚本就可以工作:
try:
accounts_next_due_date = json_data['primaryTopic']['Accounts']['NextDueDate']
if accounts_next_due_date:
pass
else:
accounts_next_due_date = 'e'
except (KeyError, TypeError) as e:
accounts_next_due_date = 'e'
但这对我来说似乎是重复,我哪里出了问题?我听到你说的是你执行了以下代码:
try:
accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory']
except (KeyError, TypeError) as e:
accounts_category = ''
然后,稍后的科目\u类别
(或您以这种方式处理的其他变量)是无
,而不是”
显然,这是因为没有出现错误。相反,json_数据['primarytico']['Accounts']['AccountCategory']
(或任何内容)实际上是None
(即原始json中的null
)
避免这种情况的最简单方法是,如果值为“false ish”,则使用或关键字添加默认值,如下所示:
使用值时也可以执行此操作:
line = "%s|%s|%s|%s\n" % (H, vn_id, sn_id, supplier_name or '')
作为奖励,因为这看起来并不是真的引发错误,所以您可以摆脱所有try/except
样板文件。如果你仍然需要它,看在上帝的份上,请编写一个函数来完成它,而不是复制和粘贴代码无数次!例如:
def jsonfield(jsonobj, default, *names):
try:
for name in names:
jsonobj = jsonobj[name]
return jsonobj or default
except (TypeError, KeyError):
return default
accounts_category = json_field(json_data, "", "primaryTopic", "Accounts", "AccountCategory")
但对我来说,这似乎是重复的
是的。为了避免这种情况,只需将帐户下一个到期日初始化为无,并添加一个finally子句:
accounts_next_due_date = None
try:
accounts_next_due_date = json_data['primaryTopic']['Accounts']['NextDueDate']
except (KeyError, TypeError):
pass # or log the error
finally:
if accounts_next_due_date is None:
accounts_next_due_date = "e"
如果出现KeyError
或TypeError
,或者如果json_数据['primarytic']['Accounts']['NextDueDate']
为None
,则finally
子句将起作用。因此没有重复的代码。在Python2中,尝试将unicode字符串与None
连接会引发TypeError
:
>>> u'abcd' + None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: coercing to Unicode: need string or buffer, NoneType found
这不会引发任何异常,因此None
可以绑定到一个或多个用于构造行
字符串的变量。您可以使用以下方法进行修复:
accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory']
if accounts_category is None:
accounts_category = u''
您可以将其推广到一个函数中,以便将其应用于JSON数据中的其他键
此外,您还可以使用str.join()
更好地执行字符串的连接:
line = u'|'.join((H, vn_id, sn_id, supplier_name)
行=…
代码如何与您发布的主代码相匹配?你也可以发布完整的回溯吗?不清楚是哪一行引起了错误。请在行=..
之前提供更多详细信息插入打印(H、vn\u id、sn\u id、供应商名称)
,并查看其中哪一个是无
。稍作解释将大有帮助。否则,我们将被迫对您的代码与问题中的代码逐个字符地进行差异。@BryanOakley:我修改了答案。如果json_数据['primarytico']['Accounts']['AccountCategory']
是整数0
或None
以外的错误值,该怎么办?类似于你的便利函数。你可能想在一个应该是数字的字段上使用或0
。非常感谢,我一直在努力设置一个函数,因为嵌套的深度变化很大,我一直在努力向函数传递正确的值。你帮了大忙。