Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: python, error met het gebruik van een class.  (gelezen 813 keer)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
python, error met het gebruik van een class.
« Gepost op: 2014/09/05, 15:46:20 »
Ik krijg een error in mijn geschreven programma voor schaakpuzzels. Onder de foutmelding heb ik een gedeelte van de code geplakt.
  File "<stdin>", line 1, in <module>
  File "puzzle.py", line 101, in open_puzzle
    print puzzle[number].pieces_w
TypeError: 'type' object has no attribute '__getitem__'
# puzzels laden
puzzles = []
with open('puzzles') as infile:
for line in infile:
z = []
white = []
black = []
if not line.startswith('#'):
line = line.rstrip()
for a in line.rsplit('\t'):
z.append(a)
for a in z[0].rsplit(' '):
white.append(a)
for a in z[1].rsplit(' '):
black.append(a)
puzzles.append(puzzle(white, black, z[2], z[3]))

# Een puzzel laden.
def open_puzzle(number):
l = len(puzzles)
if number < l:
for a in puzzle[number].pieces_w:
b = alg2nr(a[2:])
if len(a) == 2:
setpiece(b,'white','')
else:
setpiece(b,'white',a[0])
for a in puzzle[number].pieces_b:
b = alg2nr(a[2:])
if len(a) == 2:
setpiece(b,'black','')
else:
setpiece(b,'black',a[0])
im_board.show()
else:
De opbouw van het bestand met de puzzels is:
#white black player solution
a2 b2 d5 f2 f3 h2 Kb1 Qa5 Bd3 a7 b7 e6 f7 Kh6 Qd4 Ta8 Tf8 white 1.Qd2 Kh5 2.Bg6

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
Re: python, error met het gebruik van een class.
« Reactie #1 Gepost op: 2014/09/05, 17:09:40 »
Het betreffende stuk code waar de foutmelding in zit heb je niet gepost volgens mij. Dus het is lastig oordelen wat er precies fout gaat.

Deze melding wil iig zeggen dat het object, puzzle in dit geval, geen 'lijst' is en dat je er dus geen elementen uit kan halen op basis van index. De klasse implementeert dus geen __getitem__ blijkbaar. Moet het misschien puzzles zijn ipv puzzle? puzzles is wel een lijst in jouw code.

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: python, error met het gebruik van een class.
« Reactie #2 Gepost op: 2014/09/05, 17:12:30 »
Ik ben vergeten een stukje te plakken.
class puzzle(object):
def __init__(self,pieces_w,pieces_b,player,solution):
self.player = player
self.pieces_w = pieces_w
self.pieces_b = pieces_b
self.solution = solution

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
Re: python, error met het gebruik van een class.
« Reactie #3 Gepost op: 2014/09/05, 17:18:34 »
Is dat alles van die klasse? Dan implementeert die inderdaad __getitem__ niet.

Maar goed, dat is nog steeds niet genoeg informatie. De code rondom dit stuk lijkt me relevanter
File "puzzle.py", line 101, in open_puzzle
print puzzle[number].pieces_w

Gaat het om zo'n puzzle-object die zelf een lijst/sequentie implementeert, of moet je een lijst hebben bestaande uit puzzle-objecten?

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: python, error met het gebruik van een class.
« Reactie #4 Gepost op: 2014/09/05, 17:36:19 »
Het moet een lijst van puzzle objecten zijn.
Hier de complete code. (Ik dacht dat het makkelijker was om een deel van de code te verzenden, omdat het voor mij veel is (115 regels))

#!/usr/bin/env python

from PIL import Image,ImageDraw

# converteer Algebraische notatie (bijv. e4 naar 4,4)
def alg2nr(Alg):
y = 8 - int(Alg[1])
if Alg[0] == 'a':
x = 0
elif Alg[0] == 'b':
x = 1
elif Alg[0] == 'c':
x = 2
elif Alg[0] == 'd':
x = 3
elif Alg[0] == 'e':
x = 4
elif Alg[0] == 'f':
x = 5
elif Alg[0] == 'g':
x = 6
elif Alg[0] == 'h':
x = 7
return [x,y]

# De stukken op het veld zetten met coordinatie x en y met bereik van 0 tm 7
def setpiece(square,color,piece):
a,b = 100 * square[0], 100 * square[1]
if color == 'white':
if piece == '':
im_board.paste(im_w, (a,b), im_w)
elif piece == 'K':
im_board.paste(im_wK, (a,b), im_wK)
elif piece == 'Q':
im_board.paste(im_wQ, (a,b), im_wQ)
elif piece == 'B':
im_board.paste(im_wB, (a,b), im_wB)
elif piece == 'N':
im_board.paste(im_wN, (a,b), im_wN)
elif piece == 'R':
  im_board.paste(im_wR, (a,b), im_wR)
elif color == 'black':
if piece == '':
im_board.paste(im_b, (a,b), im_b)
elif piece == 'K':
im_board.paste(im_bK, (a,b), im_bK)
elif piece == 'Q':
im_board.paste(im_bQ, (a,b), im_bQ)
elif piece == 'B':
im_board.paste(im_bB, (a,b), im_bB)
elif piece == 'N':
im_board.paste(im_bN, (a,b), im_bN)
elif piece == 'R':
  im_board.paste(im_bR, (a,b), im_bR)
del draw

class puzzle(object):
def __init__(self,pieces_w,pieces_b,player,solution):
self.player = player
self.pieces_w = pieces_w
self.pieces_b = pieces_b
self.solution = solution


# puzzels laden
puzzles = []
with open('puzzles') as infile:
for line in infile:
z = []
white = []
black = []
if not line.startswith('#'):
line = line.rstrip()
for a in line.rsplit('\t'):
z.append(a)
for a in z[0].rsplit(' '):
white.append(a)
for a in z[1].rsplit(' '):
black.append(a)
puzzles.append(puzzle(white, black, z[2], z[3]))

# Afbeelding van bord en stukken laden.
im_board = Image.open('board.jpg')
im_b = Image.open('b.png')
im_bB = Image.open('bB.png')
im_bK = Image.open('bK.png')
im_bN = Image.open('bN.png')
im_bQ = Image.open('bQ.png')
im_bR = Image.open('bR.png')
im_w = Image.open('w.png')
im_wB = Image.open('wB.png')
im_wK = Image.open('wK.png')
im_wN = Image.open('wN.png')
im_wQ = Image.open('wQ.png')
im_wR = Image.open('wR.png')

# Een puzzel laden.
def open_puzzle(number):
l = len(puzzles)
if number < l:
for a in puzzle[number].pieces_w:
b = alg2nr(a[2:])
if len(a) == 2:
setpiece(b,'white','')
else:
setpiece(b,'white',a[0])
for a in puzzle[number].pieces_b:
b = alg2nr(a[2:])
if len(a) == 2:
setpiece(b,'black','')
else:
setpiece(b,'black',a[0])
im_board.show()
else:
print 'error'

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: python, error met het gebruik van een class.
« Reactie #5 Gepost op: 2014/09/05, 18:33:42 »
Ik heb er al een aantal fouten uit gehaald

Offline erik1984

  • Lid
    • erik1984
  • Steunpunt: Nee
Re: python, error met het gebruik van een class.
« Reactie #6 Gepost op: 2014/09/05, 19:07:18 »
Het is wel handig als je even zegt wat uiteindelijk je probleem heeft opgelost (zie dat je dit topic op opgelost hebt gezet). Zo is dit forum ook nuttig voor mensen die in de toekomst tegen hetzelfde probleem aanlopen.

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: python, error met het gebruik van een class.
« Reactie #7 Gepost op: 2014/09/06, 13:35:44 »
In de map waarin het programma staat het bestand puzzle.py~. Van de vorige keer dat ik het programma uitvoerde heeft python dit bestand aangemaakt. . Na deze te hebben verwijderd is het probleem opgelost.