関数アノテーション - Pythonでタイプをチェックする標準的な方法は何ですか?




python 関数アノテーション (7)

与えられたオブジェクトが与えられた型であるかどうかをチェックする最良の方法は何ですか? オブジェクトが特定の型から継承しているかどうかを確認する方法はありますか?

オブジェクトがあるとしましょう。 それがstrかどうかをチェックするには?


Pythonの型アノテーションは今や事実です。 mypy見てみましょmypy


isinstance(o, str)は、 ostrか、 strから継承する型の場合にtrueを返しstr

type(o) is strは、 oがstrの場合にのみtrueを返します。 ostrから継承する型の場合、 falseを返しstr 。 ----


オブジェクトのタイプをチェックする最も Pythonの方法は、チェックしないことです。

PythonはDuck Typingを奨励しているので、あなたはそれらを使いたい方法でオブジェクトのメソッドを使うことtry...excepttry...except 。 だからあなたの関数が書き込み可能なファイルオブジェクトを探しているのであれば、ファイルのサブクラスであることを確認しないでください。単にその.write()メソッドを使ってみてください!

もちろん、時にはこれらの素敵な抽象が壊れて、 isinstance(obj, cls)が必要なものです。 しかし、控えめに使用してください。


ダックタイピングが危険な時を知らずに邪悪なものである理由の例を以下に示します。 たとえば、Pythonコード(適切なインデントを省略している可能性があります)があります。実際にはアヒルが必要なときには、爆弾を取得しないようにisinstanceとissubclassof関数を処理することで回避できます。

class Bomb:
    def __init__(self):
        ""

    def talk(self):
        self.explode()

    def explode(self):
        print "BOOM!, The bomb explodes."

class Duck:
    def __init__(self):
        ""
    def talk(self):
        print "I am a duck, I will not blow up if you ask me to talk."    

class Kid:
    kids_duck = None

    def __init__(self):
        print "Kid comes around a corner and asks you for money so he could buy a duck."

    def takeDuck(self, duck):
        self.kids_duck = duck
        print "The kid accepts the duck, and happily skips along"

    def doYourThing(self):
        print "The kid tries to get the duck to talk"
        self.kids_duck.talk()

myKid = Kid()
myBomb = Bomb()
myKid.takeDuck(myBomb)
myKid.doYourThing()

次の行で、指定された値がどの文字タイプであるかを調べることができます:

def chr_type(chrx):
    if chrx.isalpha()==True:
        return 'alpha'
    elif chrx.isdigit()==True:
        return 'numeric'
    else:
        return 'nothing'

chr_type("12)

私は、Pythonのような動的言語を使用することについてのクールなことは、本当にそのようなものをチェックする必要はないはずだと思います。

私はあなたのオブジェクトに必要なメソッドを呼び出し、 AttributeErrorをキャッチします。 後でこれを使用すると、他の(一見無関係な)オブジェクトを使ってメソッドを呼び出すことができ、テストのためにオブジェクトを模擬するなどのさまざまなタスクを実行できます。

私はurllib2.urlopen()を使ってWebからデータを取得するときにこれを多く使っていますが、これはオブジェクトのようなファイルを返します。 これは実際のファイルと同じread()メソッドを実装しているため、ファイルから読み込むほぼすべてのメソッドに渡すことができます。

しかし、私はisinstance()を使用するための時間と場所があると確信しています。それ以外の場合はおそらくそこにはありません:)








types