Źle działające wyszukiwanie informacji w liście

0

Pisze język programowania tak dla ćwiczenia. Problem polega na tym, że w momencie, w którym sprawdzam, czy komenda pobrana z pliku istnieje program wyświetla, że nie. W tym fragmencie:

global cmd_state

    global num
    if cmd.value not in commands[len(args)]:
        cmd_state = True

    if cmd.value not in types:
        if cmd_state:
            print("{0} in line {1}:is not a command or incorrect number of arguments".format(cmd.value, num))
            exit(0)
    else:
        if cmd.value == 'int':
            if len(args) is 2:
                variables[args[0]] = int(args[1].value)
            else:
                variables[args[0]] = int()

        if cmd.value == 'float':
            if len(args) is 2:
                variables[args[0]] = float(args[1].value)
            else:
                variables[args[0]] = float()

        if cmd.value == 'string':
            if len(args) is 2:
                variables[args[0]] = str(args[1].value)
            else:
                variables[args[0]] = str()

Lista wygląda tak:

commands = [
    [''],             # 0 argument commands
    ['print'],             # 1 argument commands
    [''],           # 2 argument commands
    ['add', 'sub', 'div']
]

Cały kod można zobaczyć tutaj:
http://4programmers.net/Pastebin/5672

0

Serio? Piszesz "język programowania" a nie umiesz używać debuggera? o_O Postaw breakpoint w tej funkcji i wykonuj pod debugerem linia po linii i popatrz czemu nie przechodzi ci tego warunku.

0

Umiem korzystać z debuggera i używałem go. Tylko, że wszystko się zgadza. Problem jest podczas sprawdzania funkcji 'add' tutaj:

if cmd.value not in commands[len(args)]:

Debugger pokazuje, że długość args jest 3, więc wszystko powinno się zgadzać. A język programowania nie pisze po to, żeby w nim pisać tylko, żeby sobie poćwiczyć i czegoś się nauczyć

0

Program wejściowy:
print "Hello World"
int sth 0
add 2 2 sth

reszta działa

1

No to chyba jednak nie umiesz korzystać z debuggera. Dochodzisz do tego miejsca:
if cmd.value not in commands[len(args)]:
i teraz możesz sobie ewaluować najpierw len(args) następnie commands[len(args)] oraz cmd.value bo skoro warunek jest omijany to znaczy że wartość cmd.value NIE ZNAJDUJE się w tej liscie i kropka. Jakbym miał wróżyć z fusów to masz tam na końcu komendy jakiś biały znak, spacje, nową linię czy cos i w efekcie ten string nie pasuje do tego na liście.
Ale to wszystko widać pod debugerem jak na dłoni, tylko trzeba go uzywać z głową a nie tylko klikać "step over" cały czas.

0

cmd.value jest równe dokładnie(skopiowanie z debuggera): 'add'
a wpis w commands(skopiowany z kodu): 'add'

len(args) jest równe 3(również z debuggera)
Klasa Command:

class Command(object):
    def __init__(self, value):
        self.value = value
        self.is_cmd = 0
        self.is_kw = 0           # kw - keyword like if, else and others
0

To ja poproszę o screenshot tego ifa w debuggerze (kiedy wykonanie stoi na tym ifie) gdzie masz dodane do watch evaluacje
cmd.value
len(args)
commands[len(args)]
oraz
cmd.value not in commands[len(args)]

0

Screen dam już jutro

0

czary, jak nic musisz napisać nowy język, bo ten Python coś nie działa jak powinien

0

Ok problem rozwiązany, po tym jak przy 'int sth' ustawiam cmd_state na True nie zmieniam tego na False. Dzięki za lekcje używania debuggera

1 użytkowników online, w tym zalogowanych: 0, gości: 1