invalid syntaxの原因がわからない
これは何ですか??
Pyxelでプログラミングを始めたPython初学者です。
リブロワークスさんの『ゲームで学ぶPython!』を参考にゲームを作成しているのですが、何が間違っているのか全くわかりません。
よく聞く全角カッコなども無いですし、サンプルと比較しても何が違うか見つかりません。そもそもこの赤線は何を指しているのでしょうか?
どなたか助けてください……
Pyxelでプログラミングを始めたPython初学者です。
リブロワークスさんの『ゲームで学ぶPython!』を参考にゲームを作成しているのですが、何が間違っているのか全くわかりません。
よく聞く全角カッコなども無いですし、サンプルと比較しても何が違うか見つかりません。そもそもこの赤線は何を指しているのでしょうか?
どなたか助けてください……
画像ではなく、
Markdownのコードブロックを使用して質問文に
コードの該当箇所を貼ってもらうことはできますか?
@KawaiRrrr
Questioner
import pyxel as px
from collision import get_tiletype
from constants import TILE_CARROT, TILE_SPIKE
これで合っていますでしょうか?
invalid syntax と指摘はされるんですがしっかり実行はできるんですよね…
ありがとうございます。その方法で合っています。
特に問題無いように見えますね。
constantsモジュール(constants.py)の方で何か問題は指摘されていませんか?
@KawaiRrrr
Questioner
特に問題は指摘されてないですね。念のため貼っておきます。
# タイル判定用
TILE_NONE = 0
TILE_WALL = 1
TILE_SPIKE = 2
TILE_CARROT = 3
TILETYPE = {
(1, 0): TILE_WALL,
(2, 0): TILE_WALL,
(3, 0): TILE_WALL,
(4, 0): TILE_WALL,
(0, 2): TILE_CARROT,
(1, 2): TILE_SPIKE,
}
PythonかVSCodeのバグなんでしょうか?
どちらも問題なく見えますね。
VSCodeのPython用静的解析ツールプラグインを導入して
一回網羅的に全コードをチェックしてみてはいかがですか。
@KawaiRrrr
Questioner
試しにRuffを導入してみましたが、該当箇所については特に何もない様子?
最初の画像と変化なしです。
他箇所の問題は未使用の変数の指摘ぐらいでした。
最初の画像左の見切れた辺りにヒントがありそう。
player.pyとconstants.pyは同じ階層(entitiesフォルダ)内に存在していますか?
以上
@KawaiRrrr
Questioner
constantsモジュールはフォルダの外ですね。参考元も同じ階層構造になっていました。
player.pyを開いている状態と言うことですよね?
player.pyが保存されて無いように見えますが、一度上書き保存をしてタブを閉じ、再度player.pyを開いてから実行するとどうなるでしょう?
@KawaiRrrr
Questioner
一応このままでも実行すること自体は出来ます。
タブを開き直すとエラーは消えますが、該当箇所を消して書き直すとやっぱりinvalid syntaxと言われる。何度やってもこうでした。
constants.pyの内容をplayer.pyのclass行よりも手前に全て張り付けて、問題となっているfrom ... import行をコメントアウトして、保存してから実行でも構文エラーになりますか?
@KawaiRrrr
Questioner
IDEの挙動については詳しくは知りませんが、IDEのバグでは無いことを前提にすると、通常はマウスオーバーした際に(例え多少の遅延があっても)何かしらの概要が表示されるのが普通です。なのでcollisionにも何かしらの問題を抱えているのかも知れません。
個人的にはDictのキーにTupleが突っ込まれていることでしょうか((1, 0)や(2, 0)となっている集合部分)。
気になって久しぶりにPythonを実行してみましたが、一応代入も参照も出来るようですが、公式ドキュメントでは「辞書のキーとして有効文字なら何でも良い」とのことになっています。
一応型としてはdict[tuple[int, int], int]という扱いのようですが、このようなトリッキーな扱いはバグを誘発する元だと考えます。
Enumに直すか、素直にclassに直していった方が良いかもしれません。
ソースの全容が解らないのでこれ以上の回答は出来かねます。とにかく見直すヶ所は多いように思えます。
構文エラーが出ている状態で、その行をコメントアウトしてもエラーが消えないのは正しい挙動ですか?
コメント行に構文エラーが残ることは通常考えづらいです。エディタの構文チェッカーの内部状態が壊れていて、キャッシュされた古いソースか何かを元に誤ったエラーを出しているというのがありそうな線です。エディタを再起動したり Python 拡張を再インストールしたりしてみては。
dict のキーは hashable な値ならなんでもよく、 tuple[int, int] は hashable なので問題ありません。
hashable だが mutable なオブジェクトをキーにするとややこしいことになりますが、 immutable な tuple[int, int] であれば int や str をキーにするのと同様の感覚で使っていいかと思います。
@KawaiRrrr
Questioner
拡張の再インストール、pycacheフォルダの削除などやっていたらおそらく出なくなりました!
おっしゃる通り古いキャッシュか何かが悪さをしていたようです。皆様ありがとうございました。
ご参考まで