@KawaiRrrr

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

invalid syntaxの原因がわからない

これは何ですか??

Pyxelでプログラミングを始めたPython初学者です。
リブロワークスさんの『ゲームで学ぶPython!』を参考にゲームを作成しているのですが、何が間違っているのか全くわかりません。

1000005979.jpg

よく聞く全角カッコなども無いですし、サンプルと比較しても何が違うか見つかりません。そもそもこの赤線は何を指しているのでしょうか?
どなたか助けてください……

0 likes

4Answer

画像ではなく、
Markdownのコードブロックを使用して質問文に
コードの該当箇所を貼ってもらうことはできますか?

0Like

Comments

  1. @KawaiRrrr

    Questioner

    player.py
    import pyxel as px
    
    from collision import get_tiletype
    from constants import TILE_CARROT, TILE_SPIKE
    

    これで合っていますでしょうか?
    invalid syntax と指摘はされるんですがしっかり実行はできるんですよね…

  2. ありがとうございます。その方法で合っています。
    特に問題無いように見えますね。

    constantsモジュール(constants.py)の方で何か問題は指摘されていませんか?

  3. @KawaiRrrr

    Questioner

    特に問題は指摘されてないですね。念のため貼っておきます。

    constants.py
    # タイル判定用
    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のバグなんでしょうか?

  4. どちらも問題なく見えますね。
    VSCodeのPython用静的解析ツールプラグインを導入して
    一回網羅的に全コードをチェックしてみてはいかがですか。

  5. @KawaiRrrr

    Questioner

    試しにRuffを導入してみましたが、該当箇所については特に何もない様子?
    最初の画像と変化なしです。
    他箇所の問題は未使用の変数の指摘ぐらいでした。

最初の画像左の見切れた辺りにヒントがありそう。
player.pyとconstants.pyは同じ階層(entitiesフォルダ)内に存在していますか?
以上

0Like

Comments

  1. @KawaiRrrr

    Questioner

    constantsモジュールはフォルダの外ですね。参考元も同じ階層構造になっていました。

player.pyを開いている状態と言うことですよね?
player.pyが保存されて無いように見えますが、一度上書き保存をしてタブを閉じ、再度player.pyを開いてから実行するとどうなるでしょう?

0Like

Comments

  1. @KawaiRrrr

    Questioner

    一応このままでも実行すること自体は出来ます。
    タブを開き直すとエラーは消えますが、該当箇所を消して書き直すとやっぱりinvalid syntaxと言われる。何度やってもこうでした。

  2. constants.pyの内容をplayer.pyのclass行よりも手前に全て張り付けて、問題となっているfrom ... import行をコメントアウトして、保存してから実行でも構文エラーになりますか?

  3. @KawaiRrrr

    Questioner

    構文エラーが出ている状態で、その行をコメントアウトしてもエラーが消えないのは正しい挙動ですか?
    実行自体はやはり問題なく出来ました。
    また、問題のエラーが出ていると、このようにマウスオーバーが機能しなくなるようです。
    20260318_131632.JPG

  4. IDEの挙動については詳しくは知りませんが、IDEのバグでは無いことを前提にすると、通常はマウスオーバーした際に(例え多少の遅延があっても)何かしらの概要が表示されるのが普通です。なのでcollisionにも何かしらの問題を抱えているのかも知れません。

    個人的にはDictのキーにTupleが突っ込まれていることでしょうか((1, 0)(2, 0)となっている集合部分)。

    気になって久しぶりにPythonを実行してみましたが、一応代入も参照も出来るようですが、公式ドキュメントでは「辞書のキーとして有効文字なら何でも良い」とのことになっています。

    一応型としてはdict[tuple[int, int], int]という扱いのようですが、このようなトリッキーな扱いはバグを誘発する元だと考えます。

    Enumに直すか、素直にclassに直していった方が良いかもしれません。

    ソースの全容が解らないのでこれ以上の回答は出来かねます。とにかく見直すヶ所は多いように思えます。

  5. @KawaiRrrr

    構文エラーが出ている状態で、その行をコメントアウトしてもエラーが消えないのは正しい挙動ですか?

    コメント行に構文エラーが残ることは通常考えづらいです。エディタの構文チェッカーの内部状態が壊れていて、キャッシュされた古いソースか何かを元に誤ったエラーを出しているというのがありそうな線です。エディタを再起動したり Python 拡張を再インストールしたりしてみては。

    @STSynthe

    dict のキーは hashable な値ならなんでもよくtuple[int, int] は hashable なので問題ありません。

    hashable だが mutable なオブジェクトをキーにするとややこしいことになりますが、 immutable な tuple[int, int] であれば intstr をキーにするのと同様の感覚で使っていいかと思います。

  6. @KawaiRrrr

    Questioner

    拡張の再インストール、pycacheフォルダの削除などやっていたらおそらく出なくなりました!
    おっしゃる通り古いキャッシュか何かが悪さをしていたようです。皆様ありがとうございました。

Your answer might help someone💌