0

組み込みassertステートメントを使用して、イテラブルの空をチェックする良い Pythonic の方法はありますか? 私は見た:

しかし、アサーションを使用した解決策を探しています。以下は機能しているように見えますが、重要な例外が欠落しているかどうかはわかりません。

a = [1, 2, 3]
b = []

assert a, 'a is empty'
assert b, 'b is empty'

これが発生しますAssertionError

Traceback (most recent call last):
  File "<ipython-input-9-185714f6eb3c>", line 5, in <module>
    assert b, 'b is empty'
AssertionError: b is empty
4

2 に答える 2

4

containera (リスト、セット、タプル、辞書など) とiterable(新しい状態を生成できるもの)を混同しないように注意してください。が「空」かどうかを確認する唯一の方法iterableは、それを反復して、少なくとも 1 つの新しい状態が生成されないかどうかを確認することです。iterableそれを「空」と解釈するのは自由です。

このようなもの

def test_thing_is_empty(self):  # We are in a unittest.Testcase
    foo = iter([])  # Or any other iterable thing
    try:
        item = next(foo)
    except StopIteration:
        pass  # This is what should happen
    else:
        self.fail("Expected foo to be empty, got %s" % (item, ))

iterableまた、 anが技術的に真に「空」になることは決してないことも覚えておいてください。思いとどまることはありiterableますStopIterationが、再試行した場合に が突然新しい要素を生成し始めることがあります。

したがって、これには方法がありませんassert。失敗するかどうか試してみる必要があります。失敗した場合、唯一の真の知識は、 がiterable現在新しい状態を生成していないということです (何らかの理由で)。アイテムが戻ってきた場合、iterable二度と再現できない可能性のあるユニークで貴重なスノーフレークが生成されました (スタックのどこかでネットワークソケットから読み取ることを考えてください)。

于 2016-12-22T17:01:23.043 に答える
-2

どうですか:

assert len(a), "a is empty"

、およびオブジェクトと同じ効果assert a, ...がありますが、より明確で保守しやすいように見える場合があります。listdictset

どちらassert a, ...任意assert len(a), ...の iterableに対して動作することは保証されていませんが、アサーションが偽陽性で渡される可能性があるのではなく、 no を持たない iterable に対して例外をスローするという理由だけで、後者の方が好ましいと感じるかもしれません。完全に一般的な解決策 (つまり、それを打ち負かすイテラブルを構築できなかった解決策) はないようです。__len__

于 2016-12-22T16:59:47.253 に答える