Vill du vara del av diskussionerna i forumet, ställa frågor eller hjälpa andra? Registrera dig här!
Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Jun 2005

Python statement

Hej,

Hur kontrollerar jag ett statement ex. ett bool True/False utan att funktionen går igång i Python, jag vill att den går igång efter att den kontrollerat så att funktionerna kommer i ordning?.

Tacksam för svar.

def func1(self): res = xbmcgui.Dialog().select(strings(59940), [strings(59906), strings(59908)]) if res < 0: res = xbmcgui.Dialog().yesno(strings(59924), strings(59938)) if res is True: ADDON.setSetting('setup', 'false') exit() else: self.func1() if res == 0: ADDON.setSetting('source', 'test') kb = xbmc.Keyboard('','') kb.setHeading(strings(59941)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('test', c) return True if c == None: self.func1() elif res == 1: fn = xbmcgui.Dialog().browse(1, strings(59942), '') ADDON.setSetting('test.file', fn) return True if fn == "": self.func1() def func2(self): ... def func3(self): ... def func4(self): ... def exec: self.func1() if self.func1() is True: self.func2() if self.func2() is True: self.func3() if self.func3() is True: self.func4() if self.func4() is True: xbmcgui.Dialog().ok(strings(59924), strings(59961)) exit()

Intel Core i7-8700K | ASUS STRIX Z370-F | Corsair Vengeance LED 16GB | ASUS STRIX 1080 Ti OC |
Noctua NH-U12A | Corsair Q400 | Corsair AX1200W | Corsair Strafe RGB | Corsair M65 RGB ELITE | ASUS VG35VQ

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Jul 2017

Oklart vad du menar. Du kan inte kolla om en funktion returnerar True eller False utan att faktiskt köra funktionen. Blir inte klokare av att läsa din kod heller.

Du kan alltid spara returvärdet av en funktion för att kolla det senare. T.ex.:

ret = funktion() ... if ret: print("ret är sann") else: print("ret är falsk")

Du ska inte köra "is True" heller.

Kan du försöka förklara på ett annat sätt vad du vill uppnå?

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Jun 2005

Så som jag har det nu så går alla self.func igång två gånger i def exec.

Intel Core i7-8700K | ASUS STRIX Z370-F | Corsair Vengeance LED 16GB | ASUS STRIX 1080 Ti OC |
Noctua NH-U12A | Corsair Q400 | Corsair AX1200W | Corsair Strafe RGB | Corsair M65 RGB ELITE | ASUS VG35VQ

Trädvy Permalänk
Medlem
Plats
Östersund
Registrerad
Jan 2011
Skrivet av M89:

Så som jag har det nu så går alla self.func igång två gånger i def exec.

ja, antingen så får du ta bort ett av anropen till funktionen, eller så får du spara värden funktionen returnerar i en variabel och jämnföra mot den variabeln i nästa if-sats.

CPU: i7 4770k Noctua NH-D14 MOBO: Maximus VI Hero GPU: GTX 980 RAM: 16 GB 1600 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G500s V.v. citera mig för att få svar.

Trädvy Permalänk
Hedersmedlem
Plats
Uppsala
Registrerad
Jul 2001
Skrivet av M89:

Så som jag har det nu så går alla self.func igång två gånger i def exec.

Yes, du anropar dem två gånger.
Byt ut detta:

self.func1() if self.func1() is True: self.func2() if self.func2() is True: ...

Mot:

if self.func1(): if self.func2():

... och så vidare. ("is True" har inget med detta problemet att göra, men gör ingen nytta.)

X370 Taichi / R7 1700 @ 3.75 GHz 1.2 V / 48 GB 3200 MHz CL14 / MSI GTX 1070 Gaming, OC / Samsung 960 EVO 500 GB / Corsair RM650x
LG G6 (H870)

Trädvy Permalänk
Medlem
Registrerad
Jun 2006

Spara värdet från funktionerna i variabler (booleans), alternativt använd en nästlad if-sats bara. Din if-sats bör se ut såhär isf

if self.func1(): if self.func2(): if self.func3(): if self.func4(): xbmcgui.Dialog().ok(strings(59924), strings(59961)) exit() # behöver du verkligen denna?

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

Får känslan av en statemaskin

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Jun 2005

Tanken är att ha en tutorial med fyra olika funktioner efter varandra där man väljer olika värden, när allt är valt ska den avslutas. @Skyclaw if-satsen som du skrev fungerar men jag hade behövt att när jag gör en return att den återvänder till föregående funktion, men då får jag argument of type 'NoneType' is not iterable i funktion 2.

Intel Core i7-8700K | ASUS STRIX Z370-F | Corsair Vengeance LED 16GB | ASUS STRIX 1080 Ti OC |
Noctua NH-U12A | Corsair Q400 | Corsair AX1200W | Corsair Strafe RGB | Corsair M65 RGB ELITE | ASUS VG35VQ

Trädvy Permalänk
Hedersmedlem
Plats
Uppsala
Registrerad
Jul 2001
Skrivet av M89:

Tanken är att ha en tutorial med fyra olika funktioner efter varandra där man väljer olika värden, när allt är valt ska den avslutas. @Skyclaw if-satsen som du skrev fungerar men jag hade behövt att när jag gör en return att den återvänder till föregående funktion, men då får jag argument of type 'NoneType' is not iterable i funktion 2.

Hur ser func2 ut?
Det låter som att du gör något som "for x in y" där y är None, dvs saknar värde.

X370 Taichi / R7 1700 @ 3.75 GHz 1.2 V / 48 GB 3200 MHz CL14 / MSI GTX 1070 Gaming, OC / Samsung 960 EVO 500 GB / Corsair RM650x
LG G6 (H870)

Trädvy Permalänk
Medlem
Plats
Zion
Registrerad
Apr 2004
Skrivet av M89:

Tanken är att ha en tutorial med fyra olika funktioner efter varandra där man väljer olika värden, när allt är valt ska den avslutas. @Skyclaw if-satsen som du skrev fungerar men jag hade behövt att när jag gör en return att den återvänder till föregående funktion, men då får jag argument of type 'NoneType' is not iterable i funktion 2.

Tror det är lättare om du utförligt (gärna med bilder) berättar vad exakt du tänkt dig ska ske och hur det ser ut.
Jag antar du menar att du har olika steg i din tutorial och vill att man ska kunna gå framåt och bakåt i dem tills man är klar med den del som uppgöras av de fyra olika funktionerna?

[ i5-6600K @ 4.7Ghz || Corsair H110 GTX || 16GB DDR4 || ASUS Z170 Pro Gaming || Asus ROG 1080 Strix @ 2100+/11Ghz+ ]

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Jun 2005
Skrivet av Thomas:

Hur ser func2 ut?
Det låter som att du gör något som "for x in y" där y är None, dvs saknar värde.

def func2(self): res = xbmcgui.Dialog().multiselect(strings(59943), [strings(59925), strings(59926), strings(59927), strings(59928), strings(59929), strings(59930), strings(59931), strings(59932), strings(59933), strings(59934), strings(59935), strings(59936), strings(59937)]) if res is None: resBack = xbmcgui.Dialog().select(strings(59924), [strings(59939), strings(30308)]) if resBack < 0: self.func2() if resBack == 0: self.func1() elif resBack == 1: ADDON.setSetting('showForeignChannels', 'false') ADDON.setSetting('tutorial', 'true') exit() if res is not None: resExtra = xbmcgui.Dialog().yesno(strings(59924), strings(59962)) if 0 in res: label = 'Benelux' ADDON.setSetting('showBeneluxChannels', 'true') if resExtra is True: response = xbmcgui.Dialog().yesno(strings(59924), strings(59944).format(label)) if response is True: ADDON.setSetting('source', 'm-TVGuide') kb = xbmc.Keyboard('','') kb.setHeading(strings(59945).format(label)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('benelux_EPG', c) ADDON.setSetting('showForeignChannels', 'true') if c == None: self.func2() ADDON.setSetting('showBeneluxChannels', 'false') else: None if 1 in res: label = 'Czech' ADDON.setSetting('showCzechChannels', 'true') if resExtra is True: response = xbmcgui.Dialog().yesno(strings(59924), strings(59944).format(label)) if response is True: ADDON.setSetting('source', 'm-TVGuide') kb = xbmc.Keyboard('','') kb.setHeading(strings(59945).format(label)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('czech_EPG', c) ADDON.setSetting('showForeignChannels', 'true') if c == None: self.func2() ADDON.setSetting('showCzechChannels', 'false') else: None if 2 in res: label = 'German' ADDON.setSetting('showGermanChannels', 'true') if resExtra is True: response = xbmcgui.Dialog().yesno(strings(59924), strings(59944).format(label)) if response is True: ADDON.setSetting('source', 'm-TVGuide') kb = xbmc.Keyboard('','') kb.setHeading(strings(59945).format(label)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('german_EPG', c) ADDON.setSetting('showForeignChannels', 'true') if c == None: self.func2() ADDON.setSetting('showGermanChannels', 'false') else: None if 3 in res: label = 'Danish' ADDON.setSetting('showDanishChannels', 'true') if resExtra is True: response = xbmcgui.Dialog().yesno(strings(59924), strings(59944).format(label)) if response is True: ADDON.setSetting('source', 'm-TVGuide') kb = xbmc.Keyboard('','') kb.setHeading(strings(59945).format(label)) kb.setHiddenInput(False) kb.doModal() c = kb.getText() if kb.isConfirmed() else None if c == '': c = None ADDON.setSetting('danish_EPG', c) ADDON.setSetting('showForeignChannels', 'true') if c == None: self.func2() ADDON.setSetting('showDanishChannels', 'false') else: None

Blir ganska lång då det är 12 st if statements men skriver ut 3 st...

Intel Core i7-8700K | ASUS STRIX Z370-F | Corsair Vengeance LED 16GB | ASUS STRIX 1080 Ti OC |
Noctua NH-U12A | Corsair Q400 | Corsair AX1200W | Corsair Strafe RGB | Corsair M65 RGB ELITE | ASUS VG35VQ

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av M89:

Blir ganska lång då det är 12 st if statements men skriver ut 3 st...

Koden är lång för att du har väldigt mycket repeterad kod, du borde fundera på att stoppa sån kod i en funktion så att du inte behöver upprepa allting för varje fall. if c == None:-biten är för övrigt död kod, den kommer aldrig köras eftersom du har en return True precis ovanför.

Sen vet jag inte om det spelar någon roll men du verkar ha stavat fel på showForeginChannels, det borde vara showForeignChannel om det ska vara korrekt engelska.

Trädvy Permalänk
Hedersmedlem
Plats
Uppsala
Registrerad
Jul 2001

Hm, det blir väldigt svårt att hänga med i koden. Ett hett tips (om det är din kod från grunden och du inte bara modifierar en mindre del) är att ha mer beskrivande namn på de flesta variablerna och funktionerna. Funktionen "exec" är totalt intetsägande egentligen -- den anropar något, om den returnerar sant anropar det nåt annat, sen visar den en dialog med någon slags text. Kan vara *precis* vad som helst från mitt perspektiv

Det jag var ute efter i func2 var felet ang NoneType, så det intressanta för att kunna lösa det är väl egentligen koden omkring där backtracen visar att felet uppstår. Svårt att hjälpa till med en ovan kodbas när det är så pass mycket kod och man bara har en del.

X370 Taichi / R7 1700 @ 3.75 GHz 1.2 V / 48 GB 3200 MHz CL14 / MSI GTX 1070 Gaming, OC / Samsung 960 EVO 500 GB / Corsair RM650x
LG G6 (H870)

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Jun 2005
Skrivet av Thomas:

Hm, det blir väldigt svårt att hänga med i koden. Ett hett tips (om det är din kod från grunden och du inte bara modifierar en mindre del) är att ha mer beskrivande namn på de flesta variablerna och funktionerna. Funktionen "exec" är totalt intetsägande egentligen -- den anropar något, om den returnerar sant anropar det nåt annat, sen visar den en dialog med någon slags text. Kan vara *precis* vad som helst från mitt perspektiv

Det jag var ute efter i func2 var felet ang NoneType, så det intressanta för att kunna lösa det är väl egentligen koden omkring där backtracen visar att felet uppstår. Svårt att hjälpa till med en ovan kodbas när det är så pass mycket kod och man bara har en del.

Skrivet av perost:

Koden är lång för att du har väldigt mycket repeterad kod, du borde fundera på att stoppa sån kod i en funktion så att du inte behöver upprepa allting för varje fall. if c == None:-biten är för övrigt död kod, den kommer aldrig köras eftersom du har en return True precis ovanför.

Sen vet jag inte om det spelar någon roll men du verkar ha stavat fel på showForeginChannels, det borde vara showForeignChannel om det ska vara korrekt engelska.

Jag har korrigerat showForeignChannel men det är bara en parameter så den har inte någon större betydelse. Jag provade runt med return True glömde ta bort den.

Ang namn på funktioner så kommer de att ändras så småningom. Jag förstår att det är svårt när man bara ser en del av koden, jag får undersöka saken vidare.

Tack för alla svar!.

Intel Core i7-8700K | ASUS STRIX Z370-F | Corsair Vengeance LED 16GB | ASUS STRIX 1080 Ti OC |
Noctua NH-U12A | Corsair Q400 | Corsair AX1200W | Corsair Strafe RGB | Corsair M65 RGB ELITE | ASUS VG35VQ