[解決済み] Pythonでオブジェクトがbytesライクであるかどうかを判断する適切な方法は何ですか?
質問
私は、以下のようなコードを持っています。
str
を期待するコードがありますが、これは
bytes
を次のように処理します。
if isinstance(data, bytes):
data = data.decode()
残念ながら,これは
bytearray
. あるオブジェクトが以下のいずれかであるかどうかを調べる、より一般的な方法はありますか?
bytes
または
bytearray
なのか、それとも両方チェックすればいいのでしょうか? それとも
hasattr('decode')
は、私が感じるほど悪いのでしょうか?
どのように解決するのですか?
ここで使えるアプローチはいくつかあります。
アヒルのタイピング
Pythonは アヒルの型付け であるため、単純に以下のようにすることもできます(通常提案される方法と思われます)。
try:
data = data.decode()
except (UnicodeDecodeError, AttributeError):
pass
を使うことができます。
hasattr
を使用することもできますし、おそらくうまくいくでしょう。もちろん、これは
.decode()
メソッドが文字列を返し、厄介な副作用がないことが前提です。
個人的には、例外か
hasattr
メソッドのどちらかをお勧めしますが、どちらを使うかはあなた次第です。
str()を使う
この方法は一般的ではありませんが、可能です。
data = str(data, "utf-8")
他のエンコーディングも許容されます。ちょうどバッファプロトコルの
.decode()
. また、第3パラメータを渡してエラー処理を指定することもできます。
シングルディスパッチ汎用関数 (Python 3.4+)
Python 3.4 以降では、シングルディスパッチジェネリック関数と呼ばれる気の利いた機能があります。 functools.singledispatch . これは少し冗長ですが、より明示的でもあります。
def func(data):
# This is the generic implementation
data = data.decode()
...
@func.register(str)
def _(data):
# data will already be a string
...
のための特別なハンドラを作ることもできます。
bytearray
と
bytes
オブジェクトを作成することができます。
注意 : シングルディスパッチ関数は最初の引数に対してのみ動作します! これは意図的な機能で PEP 433 を参照してください。 .
関連
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] オブジェクトの種類を決定しますか?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] Python 3 の "python -m SimpleHTTPServer" に相当するものは何ですか?
-
[解決済み] Python 3で文字列をバイトに変換する最良の方法?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Flaskで非同期タスクを作る