21

関数、文字列、コンパイルされた正規表現、Hamcrest Matcherなど、さまざまなタイプの入力を受け取り、入力のタイプに基づいてリストを適切にフィルタリングする関数があります。

現在は を使用していますisinstance(our_filter, hamcrest.matcher.Matcher)が、これには Hamcrest をインストールする必要があります。

で文字列一致を使用することを検討していますinspect.getmro(type(POSSIBLE_MATCHER))。しかし、これは不潔に感じます。import ステートメントの前後にtry/を含むオプションがある場合もあります。except

最善のアプローチは何ですか?


@dblslash の助けを借りて、これは私がこれまでに得た最高のものです。

[x.__module__+"."+x.__name__ for x in inspect.getmro(type(POSSIBLE_MATCHER))] ['hamcrest.core.core.isequal.IsEqual', 'hamcrest.core.base_matcher.BaseMatcher', 'hamcrest.core.matcher.Matcher', 'hamcrest.core.selfdescribing.SelfDescribing', '__builtin__.object']

4

3 に答える 3

5

継承に対応したい場合は、使用してtype(POSSIBLE_MATCHER).__name__もうまくいきません。次に、継承チェーン内のすべてのタイプに対してチェックできます。

class_string in [t.__name__ for t in type(POSSIBLE_MATCHER).__mro__]
于 2020-08-10T09:17:44.420 に答える
0

これはかなり古い質問ですが、これに対する私の解決策を共有すると思いました:

  • 条件付きインポートを使用し、インポートが以前に成功したかどうかを確認するフラグを設定しisinstance()ます。(結局のところ、モジュールをインポートできない場合isinstanceは常に返す必要がありますFalse

たとえば、次のようなものです。

try:
    import somemodule

    _import_OK = True
except ImportError:
    _import_OK = False


# and then later in the code:
if _import_OK:
    q = isinstance(x, somemodule.something)
else
    q = False
于 2022-01-23T00:38:23.853 に答える