1. ホーム
  2. パイソン

TypeErrorの解決策:Unicodeエラーへの強制力

2022-02-09 07:37:57

2021年7月22日に更新しました。

この投稿を見た人が多すぎて、閲覧数は多いがコメントが少ないので、みんな高みの見物で来て、低みの見物で帰ってしまったのでしょうか ?

罪悪感回避のために書き直し✊。

エラー理由

このエラーにはいろいろな理由がありますが、私がこのエラーになったのは、エラーメッセージをよく読まなかったからです(すでに示唆されているのは、このエラーが TypeError ) と、pythonの 2 を自動的に変換します。 文字列の直後にコンマ 不完全なタプル の奇妙な挙動は

リプロダクトコード

<ブロッククオート

vi a.py

#encoding=utf-8

s1 = 'a' + 'b',
print s1
s2 = u'a' + s1 + u'b'
print s2


トリガー処理

<ブロッククオート

wanghaipeng@ubuntu:~/projects/test$ python a.py 
('ab',)
トレースバック (最も最近の呼び出しの最後)。
  ファイル "a.py", 行 5, in <module>
    s2 = u'a' + s1 + u'b' です。
TypeError: Unicode への強制: 文字列またはバッファが必要、タプルが見つかりました。

  • 再現コードの3行目の最後を見てください。文字列 'b' の後に誤ってカンマが続いています。
  • 4行目のprint文は、コンソール出力に見られるように、'ab'ではなく('ab',)と表示され、s1はもはや文字列ではなく、タプルになります。
  • 5行目の文字列スプライシング文、u'a' と u'b' は両方とも文字列で、s1 はタプルです。これは python が許容できない強型言語なので、TypeError エラーを投げつけます。

拡張リーディング

実際、python2のカンマ演算子は文字列だけでなく、カンマに続くオブジェクトはその戻り値の型がタプルに設定されます、例えば

<ブロッククオート

>>> a = 1,

>>> print a
(1,)
>>> b = 2 + a
トレースバック (最新のコールバック)。
  ファイル "<stdin>", 行 1, in <module>
TypeError: + でサポートされていないオペランド型: 'int' および 'tuple'
>>> b = '2' + a
トレースバック (最新のコールバック)。
  ファイル "<stdin>", 行 1, in <module>
TypeError: 'str' と 'tuple' オブジェクトを連結することはできません。
>>> b = '私' + a
トレースバック (最も最近の呼び出しの最後)。
  ファイル "<stdin>", 行 1, in <module>
TypeError: 'str' と 'tuple' オブジェクトを連結することはできません。
>>> b = u'me' + a
トレースバック (最も最近の呼び出し):
  ファイル "<stdin>", 行 1, in <module>
TypeError: Unicode への強制: 文字列またはバッファが必要、タプルが見つかりました。

上の対話型操作をご覧ください。変数aを要素がintのタプルにした後、変数bを代入していますが、様々なエラーが発生していることがご自身でお分かりになると思います。

また、ASCII文字列をタプルでスプライスした場合はスプライスできないことを報告するだけ、UNICODE文字列をタプルでスプライスした場合は記事タイトルのエラーを報告するため、干渉も発生しています。

終了