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

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

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

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

Q&A

解決済

1回答

33182閲覧

python 「object is not callable」のエラーが発生する

OKARA

総合スコア63

Python 3.x

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

0グッド

0クリップ

投稿2018/08/02 01:43

編集2018/08/02 02:29

発生している問題・エラーメッセージ

ログイン時にマスタ情報をクラスリストに格納する処理があります

画面遷移の設計は、ログイン後に作業画面を表示し(ログイン画面は
destroy&quitで閉じる)作業を表示し、作業がが終わった後は再度
ログイン画面を表示する画面遷移です(作業画面はdestroy&quitで
閉じる)

最初のログインの時、上述のクラスリストに格納する処理でエラーは
発生しないのですが、2回目ログインする時に「object is not callable」
のエラーが発生します

TypeError: 'DEPT_ORDERS_ITEM_TP' object is not callable

初回はエラーなく実行できているのでnot callableになる原因が
わかりません

画面遷移の実装

python

1def main(): 2 3 # アプリの初期化 4 ini() 5 6 # 画面制御 7 ROOT = TK.Tk() 8 9 while True: 10 # ログイン画面を表示する 11 LOGIN.FM_LOGIN(master=ROOT) 12 13 # 作業画面を表示する 14 WORKING.FM_WORKING(master=ROOT) 15 16 # アプリの初期化 17 ini() 18 19 ROOT = None 20 21if __name__ == "__main__": 22 main() 23

該当のソースコード(FM_LOGIN内で下記クラスを実行)

python

1import LIB.GLOBAL_VARIABLE as M 2import TP.DEPT_ORDERS_ITEM_TP as T 3from suds.client import Client 4import xml.etree.ElementTree as ET 5 6class DEPT_ORDERS_ITEM_BP: 7 8 def __init__(self): 9 # 初期化 10 M.INST_COMMON.INI_LIST_DEPT_ORDERS_ITEM() 11 12 def GET_DEPT_ORDERS_ITEM(self): 13 # WEBサービスを実行 14 URL = M.INST_COMMON.URL + "GET_ITEM.asmx?wsdl" 15 client = Client(URL) 16 17 GET_XML = client.service.GetItem() 18 19 # XMLにパース 20 DOC = ET.fromstring(GET_XML) 21 22 # アイテム情報格納 23 for CUR in DOC.findall('Table/Rows/Row'): 24 CLL_TEMP = T.DEPT_ORDERS_ITEM_TP() 25 CLL_TEMP.DEPT_ITEM_CODE = CUR.find('code').text 26 CLL_TEMP.DEPT_ITEM_NAME = CUR.find('name').text 27 M.INST_COMMON.LIST_DEPT_ORDERS_ITEM.append(CLL_TEMP) 28 CLL_TEMP = None 29 30 return None 31

DEPT_ORDERS_ITEM_TPクラス

python

1class DEPT_ORDERS_ITEM_TP: 2 3 def __init__(self): 4 self._DEPT_ITEM_CODE = "" 5 self._DEPT_ITEM_NAME = "" 6 7 @property 8 def DEPT_ITEM_CODE(self): 9 return self._DEPT_ITEM_CODE 10 11 @DEPT_ITEM_CODE.setter 12 def DEPT_ITEM_CODE(self, value): 13 self._DEPT_ITEM_CODE = value 14 15 @property 16 def DEPT_ITEM_NAME(self): 17 return self._DEPT_ITEM_NAME 18 19 @DEPT_ITEM_NAME.setter 20 def DEPT_ITEM_NAME(self, value): 21 self._DEPT_ITEM_NAME = value 22

補足情報(FW/ツールのバージョンなど)

python:3.6.5
tkinter:8.6

開発環境はWin10
IDEはvisual studio codeを使っています

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

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

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

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

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

guest

回答1

0

ベストアンサー

forループの中のT.DEPT_ORDERS_ITEM_TP()で出ていますね。関数(厳密にはcallable)ではないものに()をつけていることがエラーの原因ですから、見直してみてください。

初回ログイン時は DOC.findall('Table/Rows/Row')が空リストになるので、forループが回らないのでは? よくわからないので当てずっぽうですが。

投稿2018/08/02 01:57

編集2018/08/02 01:58
hayataka2049

総合スコア30933

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

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

OKARA

2018/08/02 02:17

リスト内にデータ個別のインスタンスを格納したいので「()」をつけてインスタンス生成しています 試しに「()」なしでテストしたところエラーは発生しなくなりましたが、M.INST_COMMON.LIST_DEPT_ORDERS_ITEMに格納される値はすべて同じ値になってしまいました 初回ログイン時の「DOC.findall('Table/Rows/Row')」については、データ件数分のループ処理されること確認してます またログイン後の作業画面ではM.INST_COMMON.LIST_DEPT_ORDERS_ITEMに格納されている値を使用しているので、初回ログイン時に空リストであることはないかと思われます
hayataka2049

2018/08/02 02:25

「インスタンス生成しています」と仰っていますが、そもそもT.DEPT_ORDERS_ITEM_TPはクラスなのですか
OKARA

2018/08/02 02:31

すみません「DEPT_ORDERS_ITEM_TP」定義ものせるべきでした DEPT_ORDERS_ITEM_TP定義も本文に追記しました DEPT_ORDERS_ITEM_TPはプロパティを格納するデータ クラスとして実装しています
hayataka2049

2018/08/02 02:34

エラー時のtracebackを省略せずぜんぶ載せてみてください(プライバシーに関わる部分は伏せても構いません)
OKARA

2018/08/02 02:53

お手数かけてすみません tracebackは下記になります Exception in Tkinter callback Traceback (most recent call last): File "C:\xxxxx\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1702, in __call__ return self.func(*args) File "c:\xxxxx\Desktop\apps\VSC_KK_PROT\FORM\LOGIN_FM.py", line 158, in LOGIN INST_BP.GET_DEPT_ORDERS_ITEM() File "c:\xxxxx\Desktop\apps\VSC_KK_PROT\BP\DEPT_ORDERS_ITEM_BP.py", line 27, in GET_DEPT_ORDERS_ITEM CLL_TEMP = T.DEPT_ORDERS_ITEM_TP() TypeError: 'DEPT_ORDERS_ITEM_TP' object is not callable ※コードをデスクトップに配置してますので「xxxxx」は「c:\Users\ユーザ名」となります。この箇所だけ伏字にしました
hayataka2049

2018/08/02 03:02

とりあえずエラー箇所は回答の見立て通りでいいのですね 初回ログインから二回目のログインまでの間に、T.DEPT_ORDERS_ITEM_TPに対して代入するようなコードが動いたりしませんか?
OKARA

2018/08/02 03:05

ブレークポイントを張ってみましたが、途中にエラー箇所が実行されることはありませんでした ログイン時ののみしか該当エラー箇所は実行されていません
hayataka2049

2018/08/02 03:10

T.DEPT_ORDERS_ITEM_TPは少なくとも初回ログイン時にはクラスとして意図通りインスタンス化できているのですよね。二回目のログインに失敗するとしたら、その間に何か別のものに化けていると考える他なさそうですが 一応、エラーが出るときのT.DEPT_ORDERS_ITEM_TPの型と中身をチェックしてみてください
OKARA

2018/08/02 04:46

type()で下記の確認をしてみました ◆type(T) ~1回目~ <class 'module'> ~2回目~ <class 'module'> ◆type(T.DEPT_ORDERS_ITEM_TP) ~1回目~ <class 'type'> mro:<method 'mro' of 'type' objects> ~2回目~ type(T.DEPT_ORDERS_ITEM_TP) <class 'TP.DEPT_ORDERS_ITEM_TP.DEPT_ORDERS_ITEM_TP'> DEPT_ITEM_CODE:<property object at 0x000000A0E340A728> fdel:None DEPT_ITEM_NAME:<property object at 0x000000A0E340A778> fdel:None ◆type(T.DEPT_ORDERS_ITEM_TP()) ~1回目~ type(T.DEPT_ORDERS_ITEM_TP()) <class 'TP.DEPT_ORDERS_ITEM_TP.DEPT_ORDERS_ITEM_TP'> DEPT_ITEM_CODE:<property object at 0x000000A0E340A728> fdel:None DEPT_ITEM_NAME:<property object at 0x000000A0E340A778> fdel:None ~2回目~ type(T.DEPT_ORDERS_ITEM_TP()) TypeError: 'DEPT_ORDERS_ITEM_TP' object is not callable 「T.DEPT_ORDERS_ITEM_TP」の扱いが1回目と2回目で違っていました 2回目の時には何か定義が重複するして参照がうまくいかなくなってるのでしょうか?
OKARA

2018/08/02 05:52

hayataka2049様 解決しました 1回目と2回目で型が違っていたので、ほか箇所でデータ型のつもりで記載していたのに、それに値を代入して変数のように扱ってしまっているところがありました PYTHONはクラス型でも代入できてしまうのですね 一つ経験を積むことができました 回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問