Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

【Pythonお悩み解決】AttributeError: 'str' object has no attribute 'splt'とは何ですか?

こんにちは、PyQサポートです。

今回は AttributeError: 'str' object has no attribute 'splt' というエラーの意味と、その解消方法を解説します。

メソッドの実行時などに、このようなエラーになることがあります。早速、質問を見ていきましょう。

質問 AttributeError: 'str' object has no attribute 'splt' というエラーはどういうものですか?

AttributeError: 'str' object has no attribute 'splt' というエラーが出ました。
どのように直したら良いでしょうか?

入力した内容(コード)

s = "Hello-GoodBye"
s.splt("-")

出たエラー(実行結果)

Python 3.10 で実行した結果

Traceback (most recent call last):
  File "/Users/pyq/1.py", line 2, in <module>
    s.splt("-")
AttributeError: 'str' object has no attribute 'splt'. Did you mean: 'split'?

回答 メソッド名が間違っています

まず、エラーメッセージの意味を解説します。

AttributeError は「属性エラー」のことです。

オブジェクトは「プロパティ」や「メソッド」を持ちますが、これらはまとめて「属性(Attribute)」とも呼ばれます。

属性は オブジェクト.属性 で参照できますが、そのオブジェクトに存在しない属性を指定すると、AttributeErrorが発生します。

今回の 'str' object has no attribute 'splt' を直訳すれば、「'str'のオブジェクトには、'splt'という属性はない」という意味です。

これは文字列(str)のオブジェクトである s に対して、splt というメソッドを実行しようとしましたが、文字列にそのような属性はないのでエラーになっています。

簡単にいえば、spltというメソッド名が間違っているということです。

正しくはspltではなくsplitなので、以下のように修正すれば動作します。

s = "Hello-GoodBye"
s.split("-")

AttributeError が発生するケース

AttributeErrorが発生すると考えられるケースは主に2つです。

属性名の入力ミス

まず考えられるのは、単純な入力ミスです。これは俗にタイポ(typo)とも呼ばれます。

今回の例では splitsplt と打ち間違えてしまったと考えられるので、このケースにあたるでしょう。

なお、Python 3.10からはエラーメッセージが改善されています。
Python 3.9で実行した場合とエラーメッセージを比較してみましょう。

Python 3.10 の場合

AttributeError: 'str' object has no attribute 'splt'. Did you mean: 'split'?`

Python 3.9 の場合

AttributeError: 'str' object has no attribute 'splt'

Python 3.10 で実行した場合、似た名前の属性があれば Did you mean: 'split'? のように表示され、修正候補を教えてくれます。
どのように修正すればよいかがより分かりやすくなっていますね。

オブジェクトの型を間違えている

オブジェクトがどのような属性を持つかは、オブジェクトの型によって決まります。

しかしPythonでは、実行前に変数の型をチェックしないため、オブジェクトの型を間違えるという可能性もあります。

たとえば、以下のような関数を作ったとします。

def split_by_hyphen(s):
    return s.split("-")

この関数の引数 s には文字列のオブジェクトが渡されることを想定していますが、呼び出し側が間違えてリストなど他の型のオブジェクトを渡してしまうかもしれません。

この関数に split 属性を持たないオブジェクトが渡された場合、やはり AttributeError が発生します。

例として、リスト型のオブジェクトを split_by_hyphen 関数に渡してみましょう。

s = ["Hello", "GoodBye"]

print(split_by_hyphen(s))

実行結果

AttributeError: 'list' object has no attribute 'split'

リスト型のオブジェクトには split 属性がないため、 AttributeError が発生しました。

AttributeError の対応方法

以上のことから、 AttributeError が発生したら、次の2点を確認してみましょう。

  1. 指定した属性名は正しいか?
  2. オブジェクトの型は正しいか?
Copyright ©2017- BeProud Inc. All rights reserved.