質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

3372閲覧

Python謎のエラー

tsunpoko

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2015/08/28 07:13

みんなのPython第3版のアプリケーションを作るというチャプターに乗っていたサンプルコードなのですが、エラーが出てしまいます。
今日ずっと調べていたのですがわからず、進捗が溶けていきます。
何度も確認しているので打ち間違えはないと思います。
教えていただけると助かります。

todoitem.py

Python

1#A class to save ToDo's Item. 2class ToDoItem(object): 3 4 #Initialization Method 5 def __init__(self, title, description, duedate, addeddate = None): 6 7 if not addeddate: 8 addeddate = datetime.now() 9 10 self.title = title 11 self.description = description 12 self.duedate = duedate 13 self.addeddate = addeddate 14 self.finished = False 15 self.finisheddate = None 16 17 18 #Finish ToDo 19 def finish(self, date = None): 20 21 self.finished = True 22 23 if not date: 24 date = datetime.now() 25 26 self.finisheddate = date 27 28 #Debug 29 def __repr__(self): 30 31 return "<ToDoItem {}, {}>".format(self.title, self.duedate.strftime('%Y/%m/%d %H:%M')) 32 33

todocontainer.py

Python

1#import module 2from datetime import datetime, timedelta 3 4#A Class To Save List of ToDo 5class ToDoContainer(object): 6 7 #Initialization Method 8 def __init__(self): 9 10 self.todos = [] 11 12 #return Items of ToDo 13 def __len__(self): 14 15 return len(self.todos) 16 17 #ToDo is sorted as DeadLine 18 def sort(self): 19 20 self.todos.sort(key = lambda x : x.duedate) #!!! 21 22 23 def __add__(self, item): 24 25 self.todos.append(item) 26 self.sort() 27 28 def __iadd__(self, item): 29 30 self.__add__(self,item) 31 return self 32 33 #IndexAccess emulation 34 def __getitem__(self, idx): 35 36 return self.todos[idx] 37 38 #eassignment of Index emulation 39 def __setitem__(self, idx, item): 40 41 self.todos[idx] = item 42 self.sort() 43 44 #del points Index emulation 45 def __delitem__(self, idx): 46 47 del self.todos[idx] 48 49 #return notEnd list of ToDo 50 def get_remaining_todos(self): 51 52 return [t for t in self.todos if not t.finished]

user@ubuntu~$ python3

from datetime import datetime
from todoitem import ToDoItem
from todocontainer import ToDoContainer

todos = ToDoContainer()
for d in range(19, 0, -1):

. . . td = ToDoItem('title {}'.format(d), datetime(2012, 10, d))
. . . todos += td
. . .
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
TypeError: unsupported operand type(s) for +=: 'ToDoContainer' and 'ToDoItem'

コメントの英語は自分が分かるように書いているので汚いのは気にしないでください。

最後の行の

todos += td

でエラーが出ていると思っているのですが
これは特殊メソッド__add__()で呼び出しているんですよね?
だったらなぜ+=が通らないのかが分からないです。
Pythonのバージョンなどが原因とは考えられないです。(たぶん
ちなみにPython3.4です。

お時間があれば回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

他の方も指摘されていますが、クラスのメソッド定義のインデントが揃っていないせいだと思います。
少なくとも__add__や__iadd__はクラスのメソッド定義になるべきもので、関数内定義の関数になっていてはおかしいですよね。

投稿2015/08/28 08:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsunpoko

2015/09/03 02:30

ありがとうございました。 インデントを揃えてみたらできました。
guest

0

インデントがずれているってことば、そもそも文法的におかしな記述になっているって事なので、試しにデバッガ(こちら)を使ってみては?

♪飾りじゃないのよぉ~○○はぁ~っ!

投稿2015/08/28 12:58

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsunpoko

2015/09/03 02:31

ありがとうございます。
guest

0

イメージ説明

これのインデントよくわからないんですが、投稿したソースコードであってますか?

投稿2015/08/28 08:13

tsunpoko

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaMaMhyu

2015/08/28 08:19

その書籍の記載が間違っているような気がします。 おそらくaddとiaddの関数部分はインデントが1段多くなってしまっている気がします。 setitemとdelitemも同様かもしれません。
TaMaMhyu

2015/08/28 08:29

公式の正誤表には出てなさそうですが、正誤表にない誤植を見つけたという人もいるようなので、そのうち更新されるのかもしれません。
guest

0

ベストアンサー

Pythonはよくわかりませんが、
+=addではなくiaddが呼び出されるのではないでしょうか?

原因かどうかはわかりませんが、質問にあるコードはインデントがずれているようですが、問題ないのでしょうか?
addiaddsortの中で定義されていることになっていないでしょうか?
もし、sortの中で定義されていることになっているとすると、ToDoContainerには++=が定義されていないことになるかと思われます。

投稿2015/08/28 08:02

編集2015/08/28 08:06
TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsunpoko

2015/08/28 08:16

addにiが抜けていました、すいません。 一応+と+=の場合も試したけどダメできませんでした.. インデントをずらして試してみますね。ありがとうございます。 自己回答のところに画像をはったので インデントがあっているか確かめてもらえまでしょうか。
tsunpoko

2015/09/03 02:31

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問