These are chat archives for dbwebb-se/python

1st
Nov 2017
limy17
@limy17
Nov 01 2017 14:08

Jag har fått komplettering på kmom04 och skulle behöva hjälp med en sak.
https://dbwebb.se/uppgift/din-egen-chattbot-marvin-inventarie

# > inv pick mumintrollet
# *marvin svarar med att han tog upp mumintrollet*
def backpack2():
    """ Marvin handles inv pick. """
    anything_pick = input() #Det som skrivits av användaren efter inv pick!
    with open("inv.data", "a") as filehandler:
        data_list.append(anything_pick.split(","))
        print("Detta finns nu i ryggsäcken: " + str(data_list))
        break

Hur väljer jag ut och sparar endast det användaren skrivit efter inv pick från input?

Eller hur är det tänkt att man ska lösa detta? Hittar inget exempel på hur man skriver kod för att hantera inventory, bara vad användaren ska skriva för att starta programmet/koden.
Allinrep
@pejg12
Nov 01 2017 14:31
@limy17 hur ser koden ut som ser att användaren har skrivit "inv pick"?
Joris Bomert
@jorisdebom
Nov 01 2017 14:34
Testa item = anything_pick.split(' ', 1)[2]
Och sedan använd item istället
Eller kalla det för något annat såklart
limy17
@limy17
Nov 01 2017 14:37
@jorisdebom Tack för tipset!
@pejg12
choice = input()

elif "> inv pick" in choice:
       quotes.backpack2()
Allinrep
@pejg12
Nov 01 2017 14:42
@limy17 parts = choice.split(' ') och sen kan du använda if 'inv' in parts[0], if 'pick' in parts[1] och quotes.backpack2(parts[2]). kom ihåg att använda print(parts) om du vill veta vad som hamnar var.
Daniel Mattsson
@daniel-mmm
Nov 01 2017 14:45
Är det ok att köra publish på ändringar på projektet efter man har lämnat in?
Allinrep
@pejg12
Nov 01 2017 14:46
@daniel-mmm ja, men se till att redovisningen på din me-sida är relevant och var försiktig så du inte förstör något som brukade funka.
Daniel Mattsson
@daniel-mmm
Nov 01 2017 14:48
Ok, toppen. Det är inga större ändringar, så de borde inte förstöra något, men jag ska föröska testa grundligt innan jag kör publish
limy17
@limy17
Nov 01 2017 14:50
@pejg12 Tack! Hur gör jag för att den importerade funktionen använder samma input-rad som if-satsen?
Så att funktionen väljer att hantera index 3 från den inputen.
Allinrep
@pejg12
Nov 01 2017 14:51
@limy17 det gör du genom att skicka med en variabel som ett argument. du kan välja om du vill skicka hela parts eller specifikt föremålet med parts[2]
limy17
@limy17
Nov 01 2017 14:52
ok
Allinrep
@pejg12
Nov 01 2017 14:52
och du måste ordna funktionsdefinitionen så att den tar emot ett argument
limy17
@limy17
Nov 01 2017 15:03
@pejg12 Jag får inte funktionerna för inv att fungera. Inget händer när jag skriver in dem.
Allinrep
@pejg12
Nov 01 2017 15:03
"inget händer" är en väldigt svår beskrivning att hjälpa till med.
tala om vad du gör, vad du förväntar dig för resultat och vad som händer istället.
limy17
@limy17
Nov 01 2017 15:04
Jag skriver "inv", när jag klickar enter försvinner bara det jag skrivit in
Allinrep
@pejg12
Nov 01 2017 15:04
använd print() för att kontrollera vilka värden variablerna innehåller precis innan de används
du ska inte skriva bara inv, du ska skriva inv pick mumintroll
limy17
@limy17
Nov 01 2017 15:05

Instruktion 1:

inv
marvin svarar med innehållet i inventoriet

Allinrep
@pejg12
Nov 01 2017 15:05
aha. ok.
så använd print för att se vart koden tar vägen
följ flödet
limy17
@limy17
Nov 01 2017 15:06
Var menar du att jag ska göra en print?
Allinrep
@pejg12
Nov 01 2017 15:07
när "inget händer" behöver man ta reda på vad som händer, det gör man genom att printa ut saker till höger och vänster och se vad som skrivs ut
var skulle du vilja att det händer något? lägg en print där
var vet du att det händer något? lägg en print där med
vilka olika vägar kan koden ha tagit däremellan? lägg flera prints där
limy17
@limy17
Nov 01 2017 15:11
Om jag använder choise för inv, och gör en print efter den initieringen, får jag det här meddelandet:
inv
['inv']
Traceback (most recent call last):
File "main.py", line 58, in <module>
menuMenu()
File "main.py", line 50, in menuMenu
elif 'inv' in choise[0]:
NameError: name 'choise' is not defined
läs felmeddelandet
NameError: name 'choise' is not defined
vad betyder det?
limy17
@limy17
Nov 01 2017 15:28
Att det inte är initierat, men det är det ju?
choice = input()
Allinrep
@pejg12
Nov 01 2017 15:28
felmeddelanden ljuger inte :) om det inte är definierat så är det inte det. dubbelkolla stavning och scope.
limy17
@limy17
Nov 01 2017 15:31
Men koden ovanför för citat fungerar ju?
elif "citat" in choice:
            quotes.citat_Marvin()
Daniel Mattsson
@daniel-mmm
Nov 01 2017 15:32
choice vs choise
limy17
@limy17
Nov 01 2017 15:33
@daniel-mmm Hur menar du?
choice = input()
parts = choice.split(' ')
Daniel Mattsson
@daniel-mmm
Nov 01 2017 15:34
Stavningen är fel
Allinrep
@pejg12
Nov 01 2017 15:34
kolla vilken rad felmeddelandet pekar på, där står det choise.
limy17
@limy17
Nov 01 2017 15:34
Ok. Jag ser.
Det måste försvunnit i och med att jag strukturerade om koden, nu står det choice överallt.
Allinrep
@pejg12
Nov 01 2017 15:35
testkör alltid din kod när du har strukturerat om och leta inte efter fel som inte finns kvar...
limy17
@limy17
Nov 01 2017 15:36
Jag letade inte efter det längre, utan försökte lösa detta:
Traceback (most recent call last):
File "main.py", line 58, in <module>
menuMenu()
File "main.py", line 52, in menuMenu
elif "pick" in parts[1]:
IndexError: list index out of range
Allinrep
@pejg12
Nov 01 2017 15:37
parts[1] existerar bara om användaren har skrivit in mer än ett ord. omslut det av en if-sats som kontrollerar att det finns tillräckligt många parts innan du använder dig av index [1]
limy17
@limy17
Nov 01 2017 15:43
Ja, det ska jag göra. Tack för tipset!
limy17
@limy17
Nov 01 2017 15:56
Hur skriver man if-satsen "if parts contains this number of index"?
Anders Nygren
@litemerafrukt
Nov 01 2017 15:57
how about "what length is this list?"
len()
limy17
@limy17
Nov 01 2017 15:58
@litemerafrukt
if len(parts) > 0:
Anders Nygren
@litemerafrukt
Nov 01 2017 15:59
"if the length of parts is greater than zero"
litemerafrukt @litemerafrukt i'm a python interpreter
limy17
@limy17
Nov 01 2017 16:00
@litemerafrukt Tack!
if len(parts) > 1:
            if "pick" in parts[1]:
                quotes.backpack2(parts)
Anders Nygren
@litemerafrukt
Nov 01 2017 16:01
@limy17 sedär! :+1: :smile:
fast du kanske bara vill lägga i parts[2] i ryggan? och då bör du kolla att det faktiskt finns en parts[2] så att du inte får ett exception
limy17
@limy17
Nov 01 2017 16:05
@litemerafrukt Funktionen kopplad till if-satsen ser ut såhär:
def backpack2(info2):
    """ Marvin handles inv pick. """
    item = info2.split(' ', 1)[2]
    with open("inv.data", "a") as filehandler:
        #data_list.append(item.split(","))
        data_list.append(item)
        print("Detta finns nu i ryggsäcken: " + str(data_list))
Om input-raden är längre än 1, måste det ju finnas minst två ord?
När jag ändrar ngt i if-satsen för inv, slutar koden ovanför för citat att fungera.
Hur kommer det sig?
elif "citat" in choice:
     quotes.citat_Marvin()

if "inv" in parts[0]:
     quotes.backpack1()
if len(parts) > 1:
    if "pick" in parts[1]:
          quotes.backpack2(parts)
     elif "drop" in parts[1]:
          quotes.backpack3(parts)
Anders Nygren
@litemerafrukt
Nov 01 2017 16:13
@limy17 Det kan vara lättare att läsa koden om backpack2 bara tar ett item Känns härifrån (malmö) som att det borde vara funktionens ansvar och att den inte skulle behöva känna till hur parts ser ut. Och visst måste det finnas minst två ord om parts har fler än ett element. Men det är inte säkert att parts har tre element.
Jag ser inte på det kodavsnittet varför koden ovanför slutat funka
limy17
@limy17
Nov 01 2017 16:24
Ok, så om man ska kunna spara något efter ex inv pick, måste input bestå ev 3 ord?
if len(parts) > 2:
== 3 kanske är bättre då till och med?
Anders Nygren
@litemerafrukt
Nov 01 2017 16:27
@limy17 det beror på om du vill kunna lägga "gula bananer" i ryggan eller om det räcker att det funkar med "gula-bananer"
och precis. du ska ju lägga tredje ordet i ryggan
limy17
@limy17
Nov 01 2017 16:27
Men isf måste ju programmet kunna spara hur många index som helst efter index 1 :)

Hur skriver jag då om...

item = info2.split(' ', 1)[2]

... till att spara allt efter index 1 till en fil?

Mikael Roos
@mosbth
Nov 01 2017 16:54
@limy17 delade tråden i forumet så deina delar om kursmaterialet ligger nu i en egen tråd här: https://dbwebb.se/forum/viewtopic.php?f=30&t=6998&p=56942#p56942
limy17
@limy17
Nov 01 2017 17:04
@mosbth Ok, tack för info.
Mikael Roos
@mosbth
Nov 01 2017 17:30
@limy17 skrev nåt svar, oklart om det gör saker tydligare eller ej, men skrev likväl.