Wdrażam grę karcianą w Pythonie, a dla mojej klasy do obsługi graczy, PlayerHandler
, niedawno zaimplementowałem __next__
, aby po prostu zadzwonić pod numer next_player
. Ponieważ rozgrywkę można myśleć w nieskończonej pętli (gracze będą grać dalej, dopóki nie zakończą lub nie wygrają/przegrają), nie ma sensu, aby przerwać iterację. Jednak może wydawać się mylące, jeśli pętla for spowodowała nieskończoną pętlę, więc czy powinienem gdzieś podnieść StopIteration
?Czy nieskończona pętla to zła praktyka?
class PlayerHandler():
"""Holds and handles players and order"""
def __init__(self, players=None, order=1):
if players is None:
self.players = []
else:
self.players = list(players)
self.current_player = None
self.next_player()
self.order = order
def get_player(self, interval):
assert type(interval) == int, "Key must be an integer!"
if not interval and self.players:
return self.current_player
elif self.players:
step = interval * self.order
index = self.players.index(self.current_player) + step
while index >= len(self.players):
index -= len(self.players)
while index <= -(len(self.players)):
index += len(self.players)
return self.players[index]
else:
raise KeyError("No players in the list!")
def next_player(self):
"""Sets the current player to the next player to play"""
if not self.current_player:
if self.players:
self.current_player = self.players[0]
else:
self.current_player = None
else:
self.current_player = self.get_player(1)
def __iter__(self):
return self
def __next__(self):
self.next_player()
return self.current_player
Myślę, że to jest pytanie https://codereview.stackexchange.com. To powiedziawszy, zastanów się nad zwiększeniem StopIteracji po ostatnim graczu, * ale *, użyj 'itertools.cycle' w gameloop, aby w razie potrzeby wrócić do pierwszego gracza. – kojiro
Nie ma nic złego w iteratorze, który nigdy się nie kończy. Jest to część tego, do czego służą iteratory - nie ma arbitralnych ograniczeń w sekwencji wartości. – dstromberg
Technicznie nie tworzysz nieskończonej pętli, ponieważ na to, na co czekasz, gracze wygrywają/przegrywają/kończą. Jest to definicja początku działania 1: pętla .... tj. gdy wciąż są gracze ... nie rezygnuj. – Amazingred