我有一个变量tx_in
,如果事务失败则是一个字典,如果成功则是一个列表。我不想在以后点击未处理的异常,而是要测试并优雅,除非事务失败(aka tx_in
是dict)。
考虑到使用Duck Typing而不是尝试测试变量是否是特定类型似乎更好的做法,我在tx_in
上实现了try catch。我尝试操纵tx_in
,如果它是一个列表,则事务成功并继续执行代码。如果不是,python将引发KeyError。我捕获KeyError然后使用自定义消息引发它。
我的实施如下。我的解决方案是否可以接受行业惯例?
try:
if tx_in[0]:
while tx_in[-1]["timestamp"] >= timestamp:
search = api.Transaction.getTransactionsList(recipientId=address, returnKey="transactions", limit=50, offset=len(tx_in), orderBy="timestamp:desc")
tx_in.extend(search)
if len(search) < 50:
break
# get all outputs
tx_out = api.Transaction.getTransactionsList(senderId=address, returnKey="transactions", limit=50, orderBy="timestamp:desc")
while tx_out[-1]["timestamp"] >= timestamp:
search = api.Transaction.getTransactionsList(senderId=address, returnKey="transactions", limit=50, offset=len(tx_out), orderBy="timestamp:desc")
tx_out.extend(search)
if len(search) < 50:
break
return sorted([t for t in tx_in+tx_out if t["timestamp"] >= timestamp], key=lambda e:e["timestamp"], reverse=True)
except KeyError:
raise KeyError('Invalid address or null transactions.')
答案 0 :(得分:2)
您可以使用内置函数isinstance
来判断您的实例类型,然后继续进行不同的过程
In [106]: help(isinstance)
Help on built-in function isinstance in module __builtin__:
isinstance(...)
isinstance(object, class-or-type-or-tuple) -> bool
Return whether an object is an instance of a class or of a subclass thereof.
With a type as second argument, return whether that is the object's type.
The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for
isinstance(x, A) or isinstance(x, B) or ... (etc.).