Empfohlene Problemumgehung für das Problem des zirkulären Imports?Python

Python-Programme
Anonymous
 Empfohlene Problemumgehung für das Problem des zirkulären Imports?

Post by Anonymous »

Ich lerne Python (ziemlich neu) und habe beschlossen, als kleines Nebenprojekt einen einfachen Stein-Papier-Schere-Bot zu erstellen, um die Lektionen anzuwenden, die ich gelernt habe.
Ich bin während meiner Entwicklung auf ein Problem gestoßen:
Image

Basierend auf meinem Verständnis und einigen Suchanfragen zu Stackoverflow (insbesondere diese Frage), dies geschieht aufgrund der Importe, die ich durchgeführt habe. Meine Dateien werden voneinander importiert. Wenn Python also versucht, eines zu laden, während das andere noch nicht fertig ist, stürzt es mit der Fehlermeldung „teilweise initialisiertes Modul“ ab. Ich habe verstanden, dass es sich um eine Art strukturelles Abhängigkeitsproblem handelt. Meine Lösung bestand also darin, eine andere Ansicht zu erstellen, die diese beiden Ansichten stattdessen aufrufen können.
Hier ist zunächst der Logikablauf, den ich für meinen Bot durchgeführt habe. Ich habe zuerst diesen Teil gemacht, in dem der Benutzer „Wie gespielt wird“ auswählt, und eine andere Ansicht, wenn der Benutzer fortfahren oder beenden möchte:
Image

Ich habe einfach die Ansichten in einer Schleife durchlaufen. Hier sind meine Ansichten. Ich füge nur den relevanten Code hinzu:

Code: Select all

rps_views.py
(die Ansicht, die der Bot zuerst aufruft)

Code: Select all

import discord, datetime
from game.rock_paper_scissors.utils.game_logic import (
get_players_choice_value,
get_bots_choice_value,
rock_paper_scissors,
get_state_emoji
)

from game.rock_paper_scissors.views.rps_navigate import (
RpsNavigate
)

rps_nav_obj = RpsNavigate()

class RpsMainMenuView(discord.ui.View):
def __init__(self, *, timeout = 180):
super().__init__(timeout=timeout)

#How to play
@discord.ui.button(label="❔How to Play", style=discord.ButtonStyle.primary)
async def how_to_play(self, btn_interaction: discord.Interaction, button: discord.ui.Button):

await btn_interaction.response.send_message(
"Classic Rock, Paper, Scissors! Choose between the three, and we'll see if you win against me!",
view=rps_nav_obj.determine_view("HTP")
)

Code: Select all

how_to_play_views.py

Code: Select all

import discord

from game.rock_paper_scissors.views.rps_navigate import (
RpsNavigate
)

rps_nav_obj = RpsNavigate()

class HowToPlayView(discord.ui.View):
def __init__(self, *, timeout: float | None = 180):
super().__init__(timeout=timeout)

#Continue
@discord.ui.button(label="✅Continue", style=discord.ButtonStyle.success)
async def htp_continue(self, btn_interaction: discord.Interaction, button: discord.ui.Button):
await btn_interaction.response.send_message(
"Ready to Play Rock Paper Scissors?",
view=rps_nav_obj.determine_view("RPS")
)

#Exit
@discord.ui.button(label="🔚 Exit", style=discord.ButtonStyle.red)
async def htp_exit(self, btn_interaction:discord.Interaction, button: discord.ui.Button):
await btn_interaction.response.send_message(
"Goodbye!"
)

Code: Select all

rps_navigate.py
, ich habe diese Ansicht erstellt, damit die beiden dies aufrufen können, anstatt voneinander abhängig zu sein.

Code: Select all

import discord
class RpsNavigate(discord.ui.View):
def __init__(self):
self = self

def determine_view(self, view_choice):
self.view_choice = view_choice
print(f"[RPS Navigate] Determining views to be passed: {self.view_choice}")

#initialize views
print("Initializing views...")
from game.rock_paper_scissors.views.rps_views import (
RpsMainMenuView,
RpsMovesView
)

from game.rock_paper_scissors.views.how_to_play_views import (
HowToPlayView
)
rps_main_menu_view = RpsMainMenuView()
how_to_play_view = HowToPlayView()
rps_moves_view = RpsMovesView()

if self.view_choice == "RPS":
return rps_main_menu_view
elif self.view_choice == "HTP":
return how_to_play_view
elif self.view_choice == "RMV":
return rps_moves_view
else:
return rps_main_menu_view

Da ich bereits erwähnt habe, dass rps_view.py die erste Ansicht ist, die mein Bot aufruft, stoße ich immer noch auf das zirkuläre Problem beim Import, wenn ich die Importe in die zweite Zeile von rps_navigate.py einfüge. Also dachte ich, ich füge es in die Methode „determine_view“ ein. Und mein Bot funktioniert perfekt. Meine Frage ist, gibt es einen besseren Weg, dies zu tun? Vielleicht liegt es daran, dass ich auch aus Java komme und es gewohnt bin, dass Importe an der Spitze der Klassen stehen. Für Ratschläge und Tipps sind wir dankbar!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post