测试列表或字典的python变量

时间:2017-06-17 01:33:36

标签: python

我有一个变量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.')

1 个答案:

答案 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.).