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

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

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

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

Q&A

解決済

3回答

6508閲覧

python エラーの対処の仕方を教えてほしいです。

bonji

総合スコア37

Python 3.x

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

0グッド

0クリップ

投稿2019/01/06 05:12

編集2019/01/06 06:52

最近、pythonを始めました。
今、複数の条件をすべてクリアした場合Trueを返し、それ以外はFalseを返す下記の関数を作成しています。
※クラス内に作成しています

作成した関数

Python

1import re 2form dadtetime import datetime 3class Check: 4 def __init__(self, item_id, amount, shipping_address, tel_number, 5 fullname, shipping_date_str, order_file): 6 self.item_id = item_id 7 self.amount = amount 8 self.shipping_address = shipping_address 9 self.tel_number = tel_number 10 self.fullname = fullname 11 self.shipping_date_str = shipping_date_str 12 self.order_file = order_file 13 14 self.amount_int = None 15 self.shipping_date = None 16 17 def validate(self, items): 18 while True: 19 items.has_id(self.item_id) 20 self.amount_int = int(self.amount) 21 if type(self.amount_int) == "int" and self.amout >= 1: 22 pass 23 else: 24 break 25 if len(self.shipping_address) > 0: 26 pass 27 else: 28 break 29 m = re.match(r"{\d}{2,4}-{\d}{4}-{\d}{4}", self.tel_number) 30 if m: 31 pass 32 else: 33 break 34 if len(self.fullname) > 0: 35 pass 36 else: 37 break 38 self.shipping_date = datetime.strptime(self.shipping_date_str, "%Y-%m-%d") 39 if self.shipping_date_str: 40 pass 41 else: 42 break 43 resulting = 1 44 break 45 if resulting == 1: 46 return True 47 else: 48 return False

実行結果

このプログラムを実行するとUnboundLocalError: local variable 'resulting' referenced before assignment
と出てしまいます。

実施した対策

一応、こちらに来る前にネットでこのエラーについて調べてみましたが、スコープ外の変数を使っている時に、print等でその変数を使用してから同じ名前で代入するとそのエラーが怒ると分かりました。
しかし、私は、このresulting変数をこの関数内で初めて使い、尚且つ、すぐさま代入をしているので違うと思っています。
念のため、適当に思いついた名前を代入しても結果は変わりませんでした。

どうしてこのエラーが起きているか分かりません。
ご教授の程よろしくお願いします。

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

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

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

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

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

hayataka2049

2019/01/06 05:22 編集

クラスと関数の先頭の宣言くらいは端折らないで書いていただけると構造がわかりやすいです。というかwhileの中でクラス定義してるんですか?
guest

回答3

0

インデントがぐちゃってるので元のコード構造がいまいち把握できませんが、先にbreakしてしまうなどしてresulting = 1の行が実行されない条件はあると思うので、そのときにresultingを参照しようとしてそのエラーになっているのでしょう。スコープはたぶん関係ありません。

投稿2019/01/06 05:40

hayataka2049

総合スコア30933

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

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

bonji

2019/01/06 06:58

回答ありがとうございます。 見直してみたら、確かにその通りでした! ありがとうございました。
guest

0

ベストアンサー

namnium1125さんのおっしゃる通りなのですが、より簡単に説明してみます。

"local variable 'resulting' referenced before assignment"
は、
"ローカル変数 'resulting' が、定義されてないのに参照されてるよ!><"
という意味になります。

python

1resulting = 1

が一度も実行されていない場合に、そのエラーが発生しているのだと思います。

なので、
>while True: の真上に resulting = 0 とでも書いておけばいいんじゃないでしょうか。
という対策がよいのではないかと、私も考えています。

投稿2019/01/06 05:44

siruku6

総合スコア1382

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

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

0

エラーが怒る→エラーが起こる…ですか笑
申し訳ありません少し吹いてしまいました

……と冗談はこれくらいにして、ツッコミどころが多そうですがとりあえずwhile True:の真上にresulting = 0とでも書いておけばいいんじゃないでしょうか。

エラーの意味は日本語で書くと「定義前の変数をいきなり使うな」って意味です。
多分他にも(エラーでなくとも)コードかデータに問題があり(意図通りに実装されていると仮定した場合はデータが何かしらの条件をパスできなかったということ。)、resulting = 1が実行される前にwhileループを抜けてしまい、resultingが定義されないままresulting == 1を実行しようとしたためエラーが生じたのかと思います。

エラー文、英語ですがちゃんと向き合いましょう。

投稿2019/01/06 05:22

編集2019/01/06 05:33
namnium1125

総合スコア2043

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

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

bonji

2019/01/06 07:02

回答ありがとうございます。 確かに、'起こる'が”怒る”になっていました。 いや、恥ずかしい限りです。 (笑) ご指摘の通りにしてみた所、上手くいきました。ありがとうございました。 英語の件につきましては、頑張りたいと思います。
namnium1125

2019/01/06 07:59

質問とは無関係ですがresultingという変数名もどうかと思います(^ ^; resultでいいですし、私でしたらvalid_checkとかにしますかね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問