Warum?


19.06.2023, 20:12

* Solved *

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

1) Dein Skript ist nicht korrekt eingerückt und am Ende des Funktionskopfs (url_loader) fehlt ein Doppelpunkt.

Bei moduls geh ich nun einmal davon aus, dass das ein benutzerdefiniertes Modul ist, welches das os-Modul importiert.

2) Deine Schleife wird sicherlich nur einmal ausgeführt.


YannisFarin 
Fragesteller
 18.06.2023, 18:19

1) Ja, der Doppelpunkt fehlt hier und die Einrückung wurde hier vom Forum weggemacht. Ist bei mir aber regelkomform vorhanden.

Bei Moduls handelt es sich um ein Skript, welches andere Module, wie os, pygame, threading, time, etc enthält. Vereinfach das importieren.

2) Ja. Die Schleife wird ganz am Anfang ausgeführt, um die Recourcen zu laden. Die if-Anweisung bereinigt die Listen, korrigiert den Timer und beendet die Schleife.

Aber warum funktioniert das importieren von der url-liste, aber nicht die timer-variable?

0
regex9  18.06.2023, 20:38
@YannisFarin

1) Der WYSIWYG-Editor von Gutefrage hat eine Formatierungsoption für Code. Schau in der Toolbar nach dem </>-Button. In manchen Fällen muss die Toolbar erst ausgeklappt werden (rechts oben im Textfeld).

Deinen Fragetext kannst du auch noch einmal bearbeiten (r.o. auf die drei vertikalen Punkte klicken > Frage bearbeiten). Das GF-Team sorgt sich anschließend um die Freigabe der Bearbeitung.

2) Wenn der Import nicht funktionieren würde, würdest du eine Fehlermeldung zurückbekommen, dass timer nicht definiert wurde.

Schau nach, wie oft die Schleife ausgeführt wird. Bei einer einmaligen Ausführung, bei der auch die if-Bedingung zutrifft, hättest du die Rechnung 0 - 1 + 1.

1
YannisFarin 
Fragesteller
 19.06.2023, 06:57
@regex9

Die Schleife läuft, so oft, wie auch dateien im Ordner enthalten sind.rechnet bei jeden durchgang + 1 und mit der if -1. Bei 32 Dateien in der schleife = 33 und mit der if dann 32. Sie funktioniert. Ich kann auch auf die Liste Ordnungsgemäß zugreifen. Nur nicht auf die Varable. Nur warum geht es bei einer liste und nicht bei der variable. Es ist mir zwar möglich, indem ich die liste nocheinmal durchzählen lassen würde, nur wäre das eine notoeration mit pflaster. Einfach nicht richtig

0
regex9  19.06.2023, 10:21
@YannisFarin

Ich konnte dein Problem nun reproduzieren. Du kannst die Variable entweder explizit über das Modul aufrufen:

import rsc

rsc.url_loader()
print(rsc.timer)

in einem Objekt kapseln:

class Info:
  def __init__(self):
    self.counter = 0

info = Info()

def url_loader():
  # do some stuff ...
  info.counter = timer

# other script:
url_loader()
print(info.counter)

oder die Funktion den Wert zurückgeben lassen.

def url_loader():
  # do some stuff ...
  return timer

# other script:
print(url_loader())

Wenn du die Variable mit der from ... import-Syntax einbindest, wird im aktuellen Scope ein neues Symbol angelegt (timer), welches den aktuellen Wert aus dem anderen Modul zugewiesen bekommt. Du importierst also nur einen Wert, keine Referenz auf die Variable. Wenn sich timer im anderen Modul ändert, bekommt das Symbol aus dem importierenden Skript nichts davon mit. Bei der Liste (oder der Lösung mit dem Objekt) ist das kein Problem, da die ihre Werte in internen Attributen speichern, deren Referenzierung beim Import nicht betroffen ist.

1
YannisFarin 
Fragesteller
 19.06.2023, 20:10
@regex9

Oha. Du hast dir also wirklich die Mühe gemacht, mein Problem zu reproduzieren.

Mit import rsc, statt from rsc import *, ging es. Ich bekam den wert 32 raus. Genau so, wie es sein sollte. Ich danke dir wirklich man. Danke danke, dass du dir da so ne Mühe gemacht hast für mich. Respekt

0