Kmom10: Syntax error trots fungerade kod

  • Författare
  • Meddelande

Signe.Liden

html-kodare

  • Inlägg: 16
  • Blev medlem: 29 aug 2016, 09:33

Kmom10: Syntax error trots fungerade kod

Inlägg27 okt 2016, 12:11

Hej.
I kmom10 ska det ju bland annat kunna dyka upp nya objekt, tex om man öppnar ett befintligt. Det hade jag tänkt lösa genom att slå ihop två dictionaries med följande kod:

Kod: Markera allt
nyDict = {**OBJEKT_RUM1, **objekt}


Det funkar fint eftersom det gör som jag vill, men jag får syntax error på den raden när jag validerar. Finns det en mer okej metod att slå ihop dictionaries eller är det något annat jag gör fel?

Här är koden i sin helhet (relevanta bitar ligger i globals OBJEKT_RUM1, OBJEKT_1 samt i def rum1() och def nyaObjekt():
Kod: Markera allt
#!/usr/bin/env python3
#-*- coding: utf-8 -*-

"""
Äventyrsspel där du ska hjälpa de goda krafterna mot de onda.
"""

# XXX – remove #OK:s

### V 1 – rum 1 klart.

import sys
import os
# import time
# import requests
import getopt
# from bs4 import BeautifulSoup
# import json
# import random

#
# Add some stuff about this script
#
PROGRAM = os.path.basename(sys.argv[0])
AUTHOR = "Signe Liden"
EMAIL = "signe.liden@gmail.com"
VERSION = "1.0"
INFO = "Regnbågarna är inte vad de har varit. För varje dag som går \n\
bleknar de allt mer. Nu måste du uppsöka regnbågsmakarens hus,\n\
hitta hennes färger och återställa ordningen.\n"
ABOUT = "Programmakare Signe Lidén är ny student i Python.\n\
I vanliga fall gillar hon grönsaker, körsång, Stephen King\n\
och lagom stora vågor."
USAGE = """{program} - Rainbow restorer. By {author} ({email}), version {version}.

Usage:
  {program} [options] argument

Argument:
  i, info                       Skriver ut beskrivningen av rummet.
  h, hjälp                      Skriver ut de kommandon du kan göra.
  fr, fram                      Gå framåt till nästa rum, om det är upplåst.
  ba, bak                       Gå bakåt till föregående rum.
  se                            Titta dig runt omkring i rummet.
  l, ledtråd                    Ge en ledtråd, eller fler om det finns.
  o, objekt                     Skriver ut vilka objekt som finns i rummet.
  t [objekt], titta [objekt]   Skriver ut beskrivningen av objektet.
  ö [objekt], öppna [objekt]   Öppna objektet om det går att öppna.
  s [objekt], sparka [objekt]   Sparka på objektet, så det kan gå sönder.
  f [objekt], flytta [objekt]   Flytta på objektet, om det går att flytta.

Options:
  -h, --help            Visar det här meddelandet. #OK
  -i, --info            Skriver ut en beskrivning av spelet och dess idé. #OK
  -v, --version         Skriver ut versionen av spelet. #OK
  -a, --about           Skriver ut en kort beskrivning av {author}. #OK
  -c, --cheat           Visar enklaste vägen genom spelet.
""".format(program=PROGRAM, author=AUTHOR, email=EMAIL, version=VERSION)


MSG_VERSION = "{program} version {version}.".format(program=PROGRAM, version=VERSION)
MSG_USAGE = "Use {program} --help to get usage.\n".format(program=PROGRAM)

#
# Global settings to be switched through:
#

ARGUMENT = ""
ARGUMENT2 = ""
RUM_KLART = 0
RUM_AKTIVT = 0
### Rum 1----------:
BESK_RUM1 = "En gammal övervigen färgbutik."
SE_RUM1 = "Bakom de skitiga skyltfönstren finns en butikslokal där färg såldes förut. Affischer med reklam för Nordsjö färg har bleknat. Det finns en disk i mittten av rummet. På den står en kassaapparat."
OBJEKT_RUM1 = { # "objekt" : ("Beskrivning", "kommandon som kan användas")
    "disk" : ("Disken är ranglig och ser inte ut att ha använts på länge.", "sparka"),
    "kassaapparat" : ("Kassaapparaten är av åttiotalsmodell. Displayen är släckt och lådan är stängd.", "öppna")
    }
OBJEKT_1 = {"färgburk 1" : ("Burken är liten, kanske 2 cm hög och 2 cm bred. Den är tung.", )}
LED_1 = ("En kassaapparat! Men den verkar låst, kanske finns nyckeln någonstans i rummet?")
DISK_UNLOCKED = False
KASSAAPPARAT_UNLOCKED = False

### Rum 2----------:
BESK_RUM2 = "Det verkar ha varit ett lager, men nu är det nästan tomt."
SE_RUM2 = "Det står ett skåp längs väggen mot butiken. En låda står längs den bortre väggen."
OBJEKT_RUM2 = { # "objekt" : ("Beskrivning", "kommandon som kan användas")
    "Skåp" : ("Skåpet är av metall. Det är stort och har ett fäste för hänglås, men inget lås sitter i.", "öppna"),
    "Låda" : ("Lådan är av kartong och igentejpad.", "öppna", "sparka")
    }
OBJEKT_21 = {"Flaska" : ("Flaskan är nästan full och innehåller en genomskinlig vätska.", "öppna", "flytta")}
OBJEKT_22 = {"Färgburk 2" : ("Burken är liten, kanske 2 cm hög och 2 cm bred. Den är tung.", )}
LED_2 = "Kolla på lådan, har den inte en liten färgfläck på sig."
SKP_UNLOCKED = False
LDA_UNLOCKED = False

### Rum 3----------:

EXIT_SUCCESS = 0
EXIT_USAGE = 1
EXIT_FAILED = 2

def printUsage(exitStatus):
    """
    Print usage information about the script and exit.
    """
    print(USAGE)
    sys.exit(exitStatus)

def printVersion():
    """
    Print version information and exit.
    """
    print(MSG_VERSION)
    sys.exit(EXIT_SUCCESS)

def change(objekt, kommando):
    """
    Interagerar med ett objekt och förändrar det, till exempel gör sönder det.
    """
    try:
        global DISK_UNLOCKED, KASSAAPPARAT_UNLOCKED, SKP_UNLOCKED, LDA_UNLOCKED

        if RUM_AKTIVT == 1:
            if kommando in OBJEKT_RUM1[objekt]:
                print("\nFörsöker {} {}.\n".format(kommando, objekt)) #Bara debug?
                if objekt == "disk":
                    DISK_UNLOCKED = True
                    print("\nEn bit av disken lossnar och under den glimmar något till. Det är en nyckel, som du tar upp.\n")

                if objekt == "kassaapparat":
                    if DISK_UNLOCKED is True:
                        KASSAAPPARAT_UNLOCKED = True
                        print("\nDu sätter nyckeln i kassaapparaten och vrider om. Lådan rullar ut. I den ligger en burk med gul färg. Du plockar på dig den och har klarat av rum 1.\n")
                    else:
                        print("\nTyvärr, kassaapparaten kan inte {}.\n".format(kommando+"s"))

            else:
                print("\nTyvärr, rummets {} kan inte {}.\n".format(objekt, kommando+"s"))

        if RUM_AKTIVT == 2:
            if kommando in OBJEKT_RUM2[objekt]:
                print("\nFörsöker {} {}.\n".format(kommando, objekt)) #Bara debug
                if objekt == "Skåp":
                    SKP_UNLOCKED = True
                    print("\nDörren öppnas och du ser en flaska på en av hyllorna.\n")

                if objekt == "kassaapparat":
                    if DISK_UNLOCKED is True:
                        KASSAAPPARAT_UNLOCKED = True
                        print("\nDu sätter nyckeln i kassaapparaten och vrider om. Lådan rullar ut. I den ligger en burk med gul färg. Du plockar på dig den och har klarat av rum 1.\n")
                    else:
                        print("\nTyvärr, kassaapparaten kan inte {}.\n".format(kommando+"s"))

                else:
                    print("\nTyvärr, rummets {} kan inte {}.\n".format(objekt, kommando+"s"))

        else:
            pass

    except Exception:
        print("\nDet där blev inte rätt. Försök igen! Eller tryck hjälp för att få info om vilka kommandon du kan använda.\n") #XXX Hjälpfunktionen!

def parseInputs():
    """
    Går igenom det som användaren matar in och förändrar globals.
    """
    kommando = input("\nAnge ett kommando för att gå vidare.\n")
    # print("1: ", kommando) #BARA DEBUG

    try:
        global ARGUMENT, ARGUMENT2

        if kommando.startswith("titta "):
            ARGUMENT = "titta"
            ARGUMENT2 = kommando[6:]
            #Argument2 vore bäst om den räknade från höger till mellanslag!

        elif kommando.startswith("t "):
            ARGUMENT = "titta"
            ARGUMENT2 = kommando[2:]

        elif kommando.startswith("sparka "):
            ARGUMENT = "sparka"
            ARGUMENT2 = kommando[7:]

        elif kommando.startswith("s "):
            ARGUMENT = "sparka"
            ARGUMENT2 = kommando[2:]

        elif kommando.startswith("öppna "):
            ARGUMENT = "öppna"
            ARGUMENT2 = kommando[6:]

        elif kommando.startswith("ö "):
            ARGUMENT = "öppna"
            ARGUMENT2 = kommando[2:]

        elif kommando.startswith("flytta "):
            ARGUMENT = "flytta"
            ARGUMENT2 = kommando[7:]

        elif kommando.startswith("f "):
            ARGUMENT = "flytta"
            ARGUMENT2 = kommando[2:]

        elif kommando in ("se"):
            ARGUMENT = "se"
            ARGUMENT2 = ""

        elif kommando in ("o", "objekt"):
            ARGUMENT = "objekt"
            ARGUMENT2 = ""

        elif kommando in ("fram"):
            ARGUMENT = "fram"
            ARGUMENT2 = ""

        elif kommando in ("bak"):
            ARGUMENT = "bak"
            ARGUMENT2 = ""

        elif kommando in ("ledtråd"):
            ARGUMENT = "ledtråd"
            ARGUMENT2 = ""

        elif kommando in ("cheat"):
            ARGUMENT = "cheat"
            ARGUMENT2 = kommando[2:]


        else:
            print("\nDet är inte ett godkänt val.\n")
            print("Här:", ARGUMENT, ARGUMENT2) #bara DEBUG
            ARGUMENT = ""
            parseInputs()

    except Exception:
        print("\nDet är inte ett godkänt val.\n")
        print("Där:", ARGUMENT, ARGUMENT2) #bara DEBUG


    # print("Val:", ARGUMENT, ARGUMENT2) #BARA DEBUG

def nyaObjekt(objekt):
    try:
        global OBJEKT_RUM1, OBJEKT_RUM2
            # Ta emot vad som ska in via argument i definitionen, samt rum aktivt
        if RUM_AKTIVT == 1:
            nyDict = {**OBJEKT_RUM1, **objekt}
            OBJEKT_RUM1 = nyDict
        elif RUM_AKTIVT == 2:
            OBJEKT_RUM2 = {**OBJEKT_RUM2, **objekt}
        else:
            print("\nHuh?\n")

    except Exception:
        pass

def rum1():
    """
    Spelets första rum.
    """
    print(BESK_RUM1)
    # print(RUM_KLART)

    while ARGUMENT is not "fram":
        parseInputs()

        # print(ARGUMENT, ARGUMENT2) #BARA DEBUG

        # print("Startar rum 1")

        try:
            global OBJEKT_RUM1, RUM_KLART, RUM_AKTIVT

            RUM_AKTIVT = 1
            # print(RUM_AKTIVT) #BARA DEBUG
            objekten = sorted(OBJEKT_RUM1.keys()) #göra lista först?

            if ARGUMENT in ("se"):
                print(SE_RUM1)

            elif ARGUMENT in ("o", "objekt"):
                print("\nI rummet finns följande objekt: {}.\n".format(', '.join(objekten))) #BARA DEBUG

            elif ARGUMENT in ("s", "sparka", "f", "flytta", "ö", "öppna"):
                # print("Argument till change:", ARGUMENT, ARGUMENT2) #BARA DEBUG
                change(ARGUMENT2, ARGUMENT)

                if KASSAAPPARAT_UNLOCKED == True:
                    print("tjena!") #Bara debug
                    nyaObjekt(OBJEKT_1)
                    RUM_KLART = 1
                    objekten = sorted(OBJEKT_RUM1.keys())
                    print('Skriv "fram" för att gå vidare till rum 2.\n')

                elif DISK_UNLOCKED == True:
                    print("tjena2!")

                else:
                    pass

            elif ARGUMENT in ("t", "titta"):
                if ARGUMENT2 in OBJEKT_RUM1:
                    urval = OBJEKT_RUM1.get(ARGUMENT2, 0)
                    beskrivning = urval[0]
                    print(beskrivning)
                else:
                    print("\nDet finns inget sådant objekt i rummet.\n")

            elif ARGUMENT in ("ledtråd"):
                print("\n{}\n".format(LED_1))

            elif ARGUMENT in ("fram"):
                if RUM_KLART > 0:
                    # print("Gick via if rum klart") #BARA DEBUG
                    break
                else:
                    print("\nDu kan inte gå framåt innnan du har klarat uppgiften.\n")
                    rum1()

            elif ARGUMENT in ("bak"):
                if RUM_AKTIVT is 1:
                    print("\nDu kan inte gå bakåt från första rummet.\n")
                    parseOptions
                else:
                    if RUM_AKTIVT is 2:
                        rum1()
            else:
                parseOptions()

        except Exception:
            pass

        # print(DISK_UNLOCKED) #BARA DEBUG


def rum2():
    """
    Lagret.
    """
    print(BESK_RUM2)
    # print(RUM_KLART)

    while ARGUMENT is not "fram":
        parseInputs()

        # print(ARGUMENT, ARGUMENT2) #BARA DEBUG

        # print("Startar rum 2")

        try:
            global OBJEKT_RUM2, RUM_KLART, RUM_AKTIVT

            RUM_AKTIVT = 2
            # print(RUM_AKTIVT) #BARA DEBUG
            objekten = sorted(OBJEKT_RUM2.keys()) #göra lista först?

            if ARGUMENT in ("se"):
                print(SE_RUM2)

            elif ARGUMENT in ("o", "objekt"):
                print("\nI rummet finns följande objekt: {}.\n".format(', '.join(objekten))) #BARA DEBUG

            elif ARGUMENT in ("s", "sparka", "f", "flytta", "ö", "öppna"):
                # print("Argument till change:", ARGUMENT, ARGUMENT2) #BARA DEBUG
                change(ARGUMENT2, ARGUMENT)

                if SKP_UNLOCKED == True:
                    print("tjena!") #Bara debug
                    nyaObjekt(OBJEKT_21)
                    objekten = sorted(OBJEKT_RUM1.keys())

                if LDA_UNLOCKED == True:
                    print("tjena!") #Bara debug
                    nyaObjekt(OBJEKT_22)
                    RUM_KLART = 2
                    objekten = sorted(OBJEKT_RUM2.keys())
                    print('Skriv "fram" för att gå vidare till rum 3.\n')

                else:
                    pass

            elif ARGUMENT in ("t", "titta"):
                if ARGUMENT2 in OBJEKT_RUM2:
                    urval = OBJEKT_RUM2.get(ARGUMENT2, 0)
                    beskrivning = urval[0]
                    print(beskrivning)
                else:
                    print("\nDet finns inget sådant objekt i rummet.\n")

            elif ARGUMENT in ("ledtråd"):
                print("\n{}\n".format(LED_2))

            elif ARGUMENT in ("fram"):
                if RUM_KLART > 1:
                    # print("Gick via if rum klart") #BARA DEBUG
                    break
                else:
                    print("\nDu kan inte gå framåt innnan du har klarat uppgiften.\n")
                    rum2()

            elif ARGUMENT in ("bak"):
                if RUM_AKTIVT is 2:
                    rum1()
            else:
                parseOptions()

        except Exception:
            pass

        # print(DISK_UNLOCKED) #BARA DEBUG




def parseOptions():
    """
    Merge default options with incoming options and arguments and return them as a dictionary.
    """
    # Switch through all options

    try:

        opts, args = getopt.getopt(sys.argv[1:], "hivac", [
            "help",
            "info",
            "version",
            "about",
            "cheat",
        ])
        # print(opts, args) #BARA DEBUG

        # if len(opts) == 0 and len(args) == 0:
        #     print("Ange minst ett argument/en option.\n \
        #         Tryck på return för att få lite info om dina möjliga val:")
        #     input()
        #     printUsage(EXIT_FAILED)

        # print("Valda opts:", opts)
        # print("Valda args:", args)

        for opt, arg in opts:
            if opt in ("-h", "--help"):
                printUsage(EXIT_SUCCESS)

            elif opt in ("-i", "--info"):
                print(INFO)
                sys.exit(EXIT_SUCCESS)

            elif opt in ("-v", "--version"):
                printVersion()
                sys.exit(EXIT_SUCCESS)

            elif opt in ("-a", "--about"):
                print(ABOUT)
                sys.exit(EXIT_SUCCESS)

            elif opt in ("-c", "--cheat"):
                print("Ofärdig funktion")
                # cheat XXX

            else:
                assert False, "Unhandled option"

    except Exception as err:
        print(err)
        print(MSG_USAGE)
        # Prints the callstack, good for debugging, comment out for production
        #traceback.print_exception(Exception, err, None)
        sys.exit(EXIT_USAGE)

def cheat(rum):
    if rum == 2:
        rum2()
    # elif rum == 3:
    #     rum3()


def main():
    """
    Funktionen som utför allt som ska göras.
    """

    parseOptions()

    # print(INFO)
    # input()
    #
    # print("Du står utanför regnbågsmakarens gamla butik. Skylten vajar \
    #     i vinden och färgen har flagnat på entrédörren. Ditt uppdrag är \
    #     att hitta regnbågens sex färger och fylla i regnbågen på himlen.\
    #     Tryck return för att fortsätta.")
    # input()

    rum1()

    if RUM_KLART == 1:
        rum2()

    # if ARGUMENT in ("get"): #OK
    #     link = ARGUMENT2
    #     get(link)
    #
    # if ARGUMENT in ("ping"):
    #     url = ARGUMENT2
    #     ping(url)
    #
    # elif ARGUMENT in ("ping-history"):
    #     fhand = open("ping-history.txt", "r")
    #     for line in fhand:
    #         print(line)
    #
    # elif ARGUMENT in ("quote"):
    #     quote()
    #
    # elif ARGUMENT in ("title"):
    #     title(ARGUMENT2)
    #
    # if ARGUMENT in ("seo"):
    #     seo(ARGUMENT2)

if __name__ == "__main__":
    main()


### Beskrivning av spelet och lite miljökänsla. Tryck på return för att gå vidare.
### parseOptions, kan det användas löpande? Testa.
### Ska main anropa respektive rumsdefinition, eller anropar rum 1 rum 2?
### Hur långt man har kommit måste registreras – i en global? – så man kan gå bak
### Rum 1 - butiken
### Rum 2 - lagret
### Rum 3 - köket
### Rum 4 - hallen
### Rum 5 – trappan
### Rum 6 - ateljén
### Rum 7 – tornrummet


MVH Signe
Användarvisningsbild

Allinrep

dbwebb

  • Inlägg: 1124
  • Blev medlem: 03 sep 2012, 09:19
  • Ort: Portugal (tillfälligt)

Re: Kmom10: Syntax error trots fungerade kod

Inlägg27 okt 2016, 22:55

Signe.Liden skrev:Det funkar fint eftersom det gör som jag vill, men jag får syntax error på den raden när jag validerar.

Den syntaxen är tillgänglig från Python version 3.5, men på studentservern körs bara version 3.4.2.

Det finns ett massivt svar på StackOverflow om hur man slår ihop två dictionaries: How to merge two Python dictionaries in a single expression?. En av lösningarna använder dict.copy() och dict.update()
Kod: Markera allt
# skapa två dictionaries
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}

# slå ihop dem
>>> z = x.copy()
>>> z.update(y)

# kontrollera resultate
>>> print(z)
{'a': 1, 'b': 3, 'c': 4}

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 14 gäster