Fehler bei einer variablen, bei anderer aber nicht (Deklarierung und Definierung gleich)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hansi1350
User
Beiträge: 6
Registriert: Freitag 27. September 2024, 11:48

Wie kann das sein dass Python hier einen Underschied macht, zwischen "port" und "history"? Ist doch im Prinzip gleich oder nicht?

Code: Alles auswählen

port = 5025 # the port number of the instrument service
historyMode = 0

def SocketConnect():
	try:
		#create an AF_INET, STREAM socket (TCP)
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		s.settimeout(0.5)
		
	except socket.error:
		print ('Failed to create socket.')
		sys.exit();
	try:
		#Connect to remote server
		s.connect((remote_ip , port))
		
def tasks():
	# Wait for command from Arduino
	if ser.in_waiting >= 0:
		bs = ser.read_until("\n", 1).decode()
		print(bs)
		if bs == "1":
			if(historyMode):
			

def main():
	global port

	global historyMode
	

	s = SocketConnect()

	
	while 1:
		tasks()
Benutzeravatar
noisefloor
User
Beiträge: 4173
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der gezeigte Code ist so doch sowieso nicht lauffähig, da sind diverse Fehler drin. Das `global` in `main` ist an der Stelle überflüssig, abgesehen davon, dass man `global` sowieso meiden sollte.

Und bitte noch die _komplette_ Fehlermeldung noch posten.

Gruß, noisefloor
Hansi1350
User
Beiträge: 6
Registriert: Freitag 27. September 2024, 11:48

Überflüssig ist das global in main nicht:
"NameError: name 's' is not defined"

Ich habe den Code ausgedünnt, und nur relevantes drinnen gelassen. Da muss ich wohl nochmal gucken mit dem global.
Benutzeravatar
__blackjack__
User
Beiträge: 14000
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hansi1350: Das ``global`` sollte da trotzdem nicht stehen. Alles was Funktionen (oder Methoden) ausser Konstanten benötigen, sollte als Argument(e) übergeben werden.

``sys.exit()`` sollte da nicht in einer Funktion stehen die eine Verbindung aufbaut. Das sollte im Hauptprogramm stehen und da eigentlich auch nur wenn damit ein Rückgabecode an den Aufrufer zurückgegeben wird der mindestens potentiell ungleich 0 ist, denn *das* ist der Zweck dieser Funktion.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
sparrow
User
Beiträge: 4526
Registriert: Freitag 17. April 2009, 10:28

@Hansi1350: Ergänzend:

Man will keine globalen Variablen. Auf der Modulebene (nicht eingerückt) stehen nur die Shebang, Importe, did Deklaration von Konstanten (die sich dadurch definieren, dass sich die Werte nie ändern), die Definition von Klassen und Variablen und dir Import-Weiche.

Funktionen erhalten alles, was sie benötigen als Parameter und geben ihr Ergebnis mit return zurück.

Bis hierher sorgt alles dafü, dass du kein global mehr brauchst, weil du keine globalen Varisblen mehr hast.

Eingerpckt wird mit 4 Leerzeichen. Keine 8 und keine Tabs.

Es gibt True und False. Man nutzt für Wahrheitswerte nicht Ganzzahlen.

Hinter das print und die öffnende aklammer gehört kein Leerzeichen.
Die Ausgbae stelle ich aber ganz in Frage. Warum den aussagekräftige Fehlermeldung plus Stacktrace unterdrücken und stattdessen eine generische Meldung ausgeben.
Benutzeravatar
noisefloor
User
Beiträge: 4173
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hansi1350 hat geschrieben: Freitag 27. September 2024, 16:56 Überflüssig ist das global in main nicht:
"NameError: name 's' is not defined"
Wo denn? Im von dir gezeigten Code sehe ich nicht, wo wegen `s ` ein NameError geworfen werden sollte. `s` wird in `main` definiert und nochmal in `SocketConnect`. Da `SocketConnect` keine Rückgabewert hat, ist das `s` in `main` gleich `True` (davon ausgehend, dass `SocketConnect` ohne Fehler durchläuft). Das ist wahrscheinlich zwar nicht, was du willst... Im gezeigten Code bekommst du wegen `ser` in `tasks` einen NameError.

Gruß, noisefloor
Antworten