1. ホーム
  2. python

[解決済み] 反復可能であるが文字列でない変数の見分け方

2023-01-23 22:21:05

質問

引数を取る関数があるのですが、引数はシングルアイテムかダブルアイテムのどちらかです。

def iterable(arg)
    if #arg is an iterable:
        print "yes"
    else:
        print "no"

というように

>>> iterable( ("f","f") )
はい

>>> iterable( ["f","f"] )
はい

>>> iterable("ff")
no

問題は、string は技術的に iterable であるため、次のような場合に ValueError をキャッチできないことです。 arg[1] . 私はisinstance()を使いたくありません、なぜならそれは良い習慣ではないからです(あるいはそう言われています)。

どのように解決するのですか?

isinstanceを使う(バッドプラクティスである理由がわからない)。

import types
if not isinstance(arg, types.StringTypes):

StringTypesを使用していることに注意してください。 これにより、不明瞭な文字列の型を忘れることがないようにします。

さらに言えば、これは派生した文字列クラスに対しても機能します。

class MyString(str):
    pass

isinstance(MyString("  "), types.StringTypes) # true

また、次のようなものもあります。 前の質問 .

乾杯。


NB: の動作は Python 3 で変更され StringTypesbasestring は定義されなくなりました。あなたの必要性に応じて、これらを置き換えるために isinstance によって str のサブセットタプル、または (str, bytes, unicode) のサブセット・タプルです。 として @Theron Luhn が言及したように、あなたは six .