関数の引数が文字列なのか、他のイテラブルなのかを判断しようとしています。具体的には、これは URL パラメーターの作成に使用され、PHP の配列構文をエミュレートしようとします。¶m[]=val
そのため、ダック タイピングはここではあまり役に立ちません¶m[]=v¶m[]=a¶m[]=l
。パラメータ値が文字列(またはバイト?実際のバイトのポイントはまだわかりません)の場合、 を生成する必要¶m=val
がありますが、パラメータ値が(たとえば)リストの場合、各要素はその値を受け取る必要があります所有する¶m[]=val
。を含む 2.* でこれを行う方法について多くの説明を見てきましたisinstance(foo, basestring)
がbasestring
、3.* には存在しません。isinstance(foo, str)
より複雑な文字列を見逃すでしょう(ユニコードだと思いますか?)。では、不必要なエラーで一部の型が失われることなくこれを行う最善の方法は何でしょうか?
質問する
94 次
1 に答える
3
Python 2 と 3 に基づいて多少競合するものを見てきました.Python 3 では、isinstance(foo, str)
ほぼ確実にあなたが望むものです。bytes
おそらく、そのような引数文字列に含めることはできない生のバイナリデータ用です。
Python 2str
型は、通常は utf8 や latin-1 などの特定のエンコーディングの文字列である生のバイナリ データを格納していました。このunicode
型には、特定のエンコーディングにエンコードできる文字のより「抽象的な」表現が格納されていました。basestring
は両方の共通の祖先であるため、「任意の種類の文字列」と簡単に言えます。
Python 3 ではstr
、より「抽象的」なタイプでありbytes
、生のバイナリ データ (特定のエンコーディングの文字列、または処理したい生のバイナリ データなど) 用です。bytes
それ以外の場合は文字列になるものには for を使用しないでstr
くださいbytes
。ただし、どうしても必要な場合は、次のようなことができますisinstance(foo, (str, bytes))
。
于 2012-11-04T03:49:56.797 に答える