こんにちは、PyQサポートです。
今回は AttributeError: 'str' object has no attribute 'splt'
というエラーの意味と、その解消方法を解説します。
メソッドの実行時などに、このようなエラーになることがあります。早速、質問を見ていきましょう。
- 質問 AttributeError: 'str' object has no attribute 'splt' というエラーはどういうものですか?
- 回答 メソッド名が間違っています
- AttributeError が発生するケース
- AttributeError の対応方法
質問 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)とも呼ばれます。
今回の例では split
を splt
と打ち間違えてしまったと考えられるので、このケースにあたるでしょう。
なお、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点を確認してみましょう。
- 指定した属性名は正しいか?
- オブジェクトの型は正しいか?