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

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

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

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

Python

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

Q&A

2回答

2879閲覧

[python]原因不明のNameErrorの原因特定・対処

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/07/27 14:00

困っていること

ブログ(http://sandmark.hateblo.jp/entry/2017/10/13/004250)を見ながらチャットボットを作成していたのですが、意味不明なエラーが出て困っています。

エラーの内容:
defaultdictがNemeError(詳細は下記)

意味不明な点:
・エラーの位置(line)が必ず29になる(使用している行を変更し、29行目を空行にしてもなる)
・defaultdictを使用している行をすべてコメントアウトしてもエラーが出る

エディタはvscodeを使用しています。
プログラミング初心者のため、一向に原因がわかりません。
原因がわかる方、助けてください。

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

... File "markov.py", line 29, in <lambda> self._dic = defaultdict(lambda: defaultdict(lambda: [])) NameError: name 'defaultdict' is not defined

※29行目を空行にした場合、エラーメッセージは
...
File "markov.py", line 29, in <lambda>

NameError: name 'defaultdict' is not defined
と、下から2行目が空行になります。

該当のソースコード

python

1... 2from collections import defaultdict 3 4class Markov: 5 ENDMARK = "%END%" 6 CHAIN_MAX = 30 7 8 def __init__(self): 9 self._dic = defaultdict(lambda: defaultdict(lambda: [])) 10 self._starts = defaultdict(lambda: 0) 11 ...

※一部分のみ抜粋

試したこと

・_init_内で例外処理を試みたが、例外処理にかからずエラー
・import分含め、defaultdictが出てくる行をすべてコメントアウトしたが、エラー

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

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

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

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

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

y_waiwai

2019/07/27 14:09

> ・import分含め、defaultdictが出てくる行をすべてコメントアウトしたが、エラー このときのエラーメッセージは何でしょうか
退会済みユーザー

退会済みユーザー

2019/07/27 14:26 編集

拝見ありがとうございます。 コメントアウトした際ですが、上記のエラーメッセージと同じものが出ます。 使用している箇所がない以上、NameErrorが出るはずないと思うのですが…
Lhankor_Mhy

2019/07/29 03:06

markov.py はモジュールですか?
退会済みユーザー

退会済みユーザー

2019/07/29 03:46

モジュールなどの言葉の意味がいまいち理解できていないので断定はできませんが、モジュールだと思います。 markov.pyは、「該当のソースコード」の箇所に記載したコードが書かれているファイルで、別ファイルから呼び出して使っています。 モジュールの意味をはき違えていたら申し訳ありません。
Lhankor_Mhy

2019/07/29 03:47

パスが通っている場所に同名のディレクトリやファイルは存在していませんか?
退会済みユーザー

退会済みユーザー

2019/07/29 04:17

拡張子が違えば別名ファイルとしていいですよね? それであれば、同名のファイルは存在しません。
Lhankor_Mhy

2019/07/29 04:43

markov というディレクトリもないのですよね……?
退会済みユーザー

退会済みユーザー

2019/07/29 04:50

はい、ありません……
Lhankor_Mhy

2019/07/29 05:01

現象としては、別のディレクトリにある markov を import しているようにしか見えないのですが、それはありえない、ということですよね。すみませんが、ちょっと原因がわからないです。
退会済みユーザー

退会済みユーザー

2019/07/29 05:07

考察ありがとうございます。 ただいま回答にも載せましたが、どうやら見当違いの情報を伝えていたようです。 申し訳ありません。
guest

回答2

0

いろいろ試していたら、根本的な解決ではありませんが、一応エラーが出なくなったので報告まで。

まずは、エラーの原因ですが、エラーメッセージと、「該当のソースコード」に記載した箇所とは関係ないところにありました。
見当違いの質問の仕方をしてしまい、申し訳ありません。

このプログラムはdatファイルを会話を生成する辞書ファイルとして読み込んでいるのですが、この辞書ファイルを外部で作成してから読み込ませようとすると、例のエラーが発生するようでした。
そのため、プログラム内で辞書ファイルを作成するようにしたら、正常に動作し、その後プログラムを再起動してもエラーは出なくなりました。

本来はtxtファイルをdatファイルに変換し、そのファイルを読み込む使い方を想定していたのですが、どうやらそれができなかったようで・・・

取り合えずエラーは出なくなりましたが、質問の不自然な挙動(1度目は読み込めるのに、次に通るとNameErrorがでる)や、datファイルを別のプログラムで作成すると例のエラーが出る、等の原因が推測できる方はご教授いただけると嬉しいです。

お騒がせして申し訳ありませんでした。

投稿2019/07/29 05:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

走らせようとしてる.pyファイルと、編集しているファイルが別ってことはないでしょうか。

#まあ、よくあるっちゃーよくあるミスですが

投稿2019/07/27 14:27

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2019/07/27 14:48

素早い回答、ありがとうございます。 デバッグをしてみましたが、ファイルの移動もしっかりとしていますし、その可能性は低いかと… チャットボットのプログラム実行時にエラー箇所を通るタイミングとしては、 1.初回起動時 2.言葉を投げかけた時 の2つがある(確認が取れている)のですが、ブレークポイント(def __init__..., self._dic = ..., self._starts = ...の計3つ)を付けたところ、1の初回起動時では正常に通過しています。 しかし、2の言葉を投げかけた時に、1つもかからず、NameErrorがでました... プログラムを組んでいて、このようなことはあるのでしょうか…?
0kcal

2019/07/27 15:28

お疲れ様です。 環境の問題だと想像します。 Pythonのこのレベルのエラーで、意味不明のエラーは出ない気がします。 どういう環境で実行されていますか? PCを再起動しても、再現しますか? また、コードの前半部分30行ほど、すべて、提示されるのがいいと思います。
退会済みユーザー

退会済みユーザー

2019/07/28 04:12

コメントありがとうございます。 > どういう環境で実行されていますか? pythonのバージョン:3.7.2 エディタ:vscode 他に何か提示したほうが良いものはありますか? > PCを再起動しても、再現しますか? 再現しました。 ちなみに、PCを変えて実行しても同エラーが再現しました。 > また、コードの前半部分30行ほど、すべて、提示されるのがいいと思います。 コードが複数のファイルに分かれており、どこからどこまでを提示すればよいかよくわかりませんでした。 エラーが出る直前のコードを提示すればよいのでしょうか?
0kcal

2019/07/28 14:21

なるほど、再現するんですね。 まず、 (1) 「import分含め、defaultdictが出てくる行をすべてコメントアウトしたが、エラー」は、 正しくコメントアウトできていれば、defaultdictという文字が出るはずがないので、 正しくコメントアウトできていないと思います。 たとえば、拡張子が違うファイルが複数できているとか。 Markov.py Markov.py.txt とか。 あと、 (2) 以下が同一ファイル内に以下のとおり書かれていたら、 name 'defaultdict' is not defined とは、絶対に出ない気がします。 importと、classのファイルがわかれているのでは? ‘‘‘ from collections import defaultdict class Markov: def __init__(self): self._dic = defaultdict(lambda: defaultdict(lambda: [])) ‘‘‘ → まず、(1)の解決を試みて下さい。
退会済みユーザー

退会済みユーザー

2019/07/29 05:33

(1)についてですが、うまく意図を汲み取れませんでした…… とりあえず、コメントアウトという件については、defaultdictの文字を使用している行(同ディレクトリ内にあるファイルすべて)をすべてコメントアウトしましたが、相変わらず再現します。 vscodeの検索機能で確認したので漏れはないはずです。 (2)については、同一ファイル内に書かれていますが、同じくエラーが再現します。 そして、回答に書かせていただきましたが、見当違いの情報で推察させてしまっていたようです。 申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問