1

私は何度も次のようなものを見てきました:

def parse(text):
    if hasattr(text, 'read'):
        text = text.read()

    # Parse the text here...

しかし、次のクラスのインスタンスを渡すと、確実に失敗します。

class X(object):
    def __init__(self):
        self.read = 10

私の質問は次のとおりです。それを処理する最もpythonicな方法は何ですか?

私は主に2つの方法について考えてきました。

if hasattr(text, 'read') and callable(text.read):
    text = text.read()

try:
    text = text.read()
except ...
4

2 に答える 2

4

pythonic の方法は、が適切な型であると仮定することtextです。try-except/を使用するのは、それが異なる時期にまったく異なるものになることがわかっているhasattr場合のみですtext

つまり、検証しないでください。を使用する場合、および で特別な処理が本当に必要な場合にのみ使用しifてください。elsetryexcept

于 2013-03-14T04:53:36.343 に答える
2

pythonic の方法では、オブジェクトの型をまったくチェックしていません。1つは、言語が非常に複雑であるため、後で失敗するオブジェクトを含めないようにするのに苦労することです(投稿の明らかな例:関数が0引数を取るかどうかを確認しません。戻り値の型について考えてください)、さらに悪いことに、誤って有効なコードを簡単に除外してしまう可能性があります。

入力値は問題ないと仮定して、そうでない場合は後で失敗することをお勧めします。

実際には 1 つだけ例外があります。異なる型 (文字列/リストなど) に対して異なるコード パスがあるとします。この場合、どのパスを使用するかを決定するために型を確認する必要があります。しかし、繰り返しになりますが、最も一般的なチェックを試してみてください (つまり、同じように機能するisinstance(l, list)かどうかはチェックしないでくださいisinstance(l, collections.Iterable))。後で「ストリング」のストリングが十分でなかったことが判明した場合は、いつでも失敗する可能性があります。

于 2013-03-14T05:16:03.753 に答える