17

よりよく説明するために、次の単純な型チェッカー関数について考えてみましょう。

from collections import Iterable
def typecheck(obj):
    return not isinstance(obj, str) and isinstance(obj, Iterable)

objが 以外の反復可能な型の場合、strを返しますTrue。ただし、がまたは反復不可能な型の場合objは、を返します。strFalse

型チェックをより効率的に実行する方法はありますか? objつまり、一度タイプをチェックして a でないかどうかを確認し、もう一度strチェックして反復可能かどうかを確認するのはちょっと冗長に思えます。

str次のように、他のすべての反復可能な型をリストすることを考えました。

return isinstance(obj, (list, tuple, dict,...))

しかし問題は、そのアプローチでは、明示的にリストされていない他の反復可能な型が見逃されることです。

それで...もっと良いものはありますか、それとも私が関数で与えたアプローチが最も効率的ですか?

4

1 に答える 1

15

Python 2.x では、イテラブルはこの属性を持つべきですが、文字列は持っていないため、__iter__属性をチェックすることは役に立ちました (常に賢明ではありません)。

def typecheck(obj): return hasattr(myObj, '__iter__')

欠点は__iter__、これが真に Pythonic な方法ではないことです。たとえば、一部のオブジェクトは実装できます__getitem__が、そうではありません。__iter__

Python 3.x では、文字列が__iter__属性を取得し、このメソッドが壊れていました。

あなたがリストした方法は、Python 3.xで私が知っている最も効率的な真のPythonicの方法です:

def typecheck(obj): return not isinstance(obj, str) and isinstance(obj, Iterable)

Python 2.x のようにチェック__iter__し、続いてstr.

def typecheck(obj): return hasattr(obj, '__iter__') and not isinstance(obj, str)

これには Python 2.x と同じ注意事項がありますが、はるかに高速です。

于 2013-11-13T02:46:27.233 に答える