Parameteranzahl

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
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

Hab mal noch ne andere Frage:

Um Funktionen als Threads zu starten habe ich mir eine Funktion erstellt:

Code: Alles auswählen

def asThread(function,params):
  t3 = Thread(target=function,args=params)
  t3.setDaemon(True)
  t3.start()
z.B. möchte ich solch eine Funktion aufrufen. Nur bekomme ich immer den Fehler "falsche anzahl argumente mitgegeben."

Code: Alles auswählen

aufruf - 
txtforike = ['test',False]
asThread(sendToIKE,txtforike)

def sendToIKE(txtforike):
  Text = txtforike[0]
  Wel = txtforike[1]
  ...
  pass
Nun habe ich aber mit der Übergabe von unterschiedlicher Anzahl von Argumenten.
Durch suchen usw. habe ich was gefunden, dass man einen stern verwenden kann.
Habt ihr was wo ich das auf deutsch(in englisch fällt mir das verständnis weniger leicht) gut erklärt nachlesen kann, oder erklärt es mir schnell.
empty Sig
BlackJack

@harryberlin: Du übergibst da zwei Argumente, die Funktion erwartet aber nur eines. Das `args`-Argument von `Thread` muss eine Sequenz mit den Argumenten sein. Auch wenn es kein Argument gibt (die Voreinstellung) oder nur ein Argument gibt, muss dieses eine Argument als einziges Element in einem Tupel oder einer Liste stehen.

Deine Einrückung ist nicht tief genug — vier Leerzeichen pro Ebene sollten es sein — und die Namensschreibweise hält sich auch nicht an den Style Guide for Python Code. Leerzeichen nach Kommas sind genau wie in Prosa auch in Quelltext üblich, damit man das leichter lesen kann.

Warum heisst der einzige lokale Name in der Funktion `t3`? Zahlen an Namen zu hängen ist ein „code smell“. Hier sogar total unverständlich. Ausserdem hätte man `thread` auch ausschreiben können.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

BlackJack, ich weiß viele bekommen augenkrebs bei meinem code. aber bitte keine belehrungen mehr. ich habe es verstanden.
ständige hinweise darauf nimmt mir nur die laune :(
wenn zeit ist, werde ich eingiges überarbeiten und klassieren.

ich habe es gerade mit *args versucht, aber es wird immer ein argument zu viel mitgegeben. habe den eindruck das erste ist auch dabei.

Code: Alles auswählen

def asThread(function,*args):
  t3 = Thread(target=function,args=(args))
  t3.setDaemon(True)
  t3.start()

Code: Alles auswählen

Fehler:
asThread(sendToIKEthread,Text,SendInEveryCase)
TypeError: asThread() takes at most 2 arguments (3 given)
empty Sig
BlackJack

@harryberlin: Wenn Du keine Behlerungen mehr hören möchtest dann gehe einfach mal auf die Hinweise ein in dem Du sie umsetzt. Nicht irgendwann, insbesondere nicht dann wenn alles fertig ist und wir es dann nicht mehr sehen müssen, sondern bevor Du Code zeigst. :-)

Erfahrungsgemäss wird aus dem „später räume ich den Code mal auf“ nichts. Wenn man sich das nicht gleich von Anfang an dran gewöhnt, wird man weiter schlecht les- und wartbaren Code schreiben. Was es dann letztendlich auch Dir selbst schwer macht. Beim überlegen was ein guter Name für einen Wert ist merkt man selbst beispielsweise oft ob man etwas nicht verstanden hat. Denn wenn man Schwierigkeiten hat einen griffigen, treffenden Bezeichner für etwas zu finden, dann hat man sehr wahrscheinlich das was man benennen will nicht verstanden, oder man hat zu viel zu einem Objekt zusammengepresst und findet deshalb keinen prägnanten Namen für das ganze. Guter Stil hat nicht nur etwas mit hübsch und reiner Optik zu tun, sondern hat auch eine Funktion: Den Quelltext und Code möglichst lesbar und leicht verständlich zu halten. Für andere, aber auch für einen selbst. Denn man ist im eigenen Quelltext oft genug selbst der ”Fremde” wenn man den nach ein paar Monaten wieder anfassen und verändern muss und den Autor verflucht der man damals war. ;-)

Die Sternchen-Magie in der Funktionssignatur würde ich bleiben lassen. Das macht den Code komplexer und man verbaut sich auch gleich noch später weitere Positionsargumente hinzufügen zu können.

Die Klammern um `args` beim Aufruf von `Thread` haben keine Wirkung. Tupel werden bis auf die Ausnahme des leeren Tupels *nicht* durch Klammern erstellt, sondern durch Kommas. Ab und zu muss man Klammern setzen damit der Ausdruck eindeutig ist, aber grundsätzlich sind es die Kommas die Tupel erstellen.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

kannst du ab post von gestern 21:56 einen eigenen thread erstellen?
empty Sig
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

Ok, hab es nun in "schönschrift"
funktioniert das denn auch so?

Code: Alles auswählen

def as_thread(function,params=[]):
    thread = Thread(target=function,args=params)
    thread.setDaemon(True)
    thread.start()

def send_to_ike(txtforike):
    stext = txtforike[0]
    bwel = txtforike[1]
    ...
    pass
aufruf:

Code: Alles auswählen

txtforike = ['test',False]
as_thread(sendToIKE,[txtforike])
empty Sig
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

hab nun mal mehr zeit gehabt um das ganze mit pycharm zu testen.
mein ergebnis schaut jetzt so aus.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from threading import Thread

def as_thread(function, *args):
    thread = Thread(target=function, args=args)
    thread.setDaemon(True)
    thread.start()

def test_it(stext, bwel=False):
    print stext
    print bwel
    pass


as_thread(test_it, 'test', True)

pass
empty Sig
BlackJack

@harryberlin: Wie gesagt: Die *-Magie würde ich sein lassen und stattdessen eine Liste oder ein Tupel übergeben.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

ich mag es eher so, weil man auch mal schnell die eckigen klammern vergessen oder übersehen kann.
da würde ich einfach mal sagen, jeder wie er mag.
oder schreibt die python docu sowas auch vor?
empty Sig
BlackJack

@harryberlin: Es ist ”Magie” und man verbaut sich damit die Funktion durch weitere Positionsargumente erweitern zu können.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

wie würdest du die function denn z.B. erweitern wollen?
*args soll für die zielfunctionen genutzt werden.
wenn ich mehr parameter für as_thread brauche, würde ich die vor *args setzen.

oder ist es falsch?
empty Sig
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Eine mögliche Erweiterung wäre ein Parameter um zu definierien ob der Thread ein Daemon Thread werden soll oder nicht. Wenn du einen Parameter vor *args setzt bist du nicht mehr rückwärtskompatibel und musst jeden Aufruf von as_thread anpassen.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

ok, kann ich verstehn.
auch dass ihr mich jetzt schon darauf hinweisen wollt, damit ich später nicht unnötig frage.
empty Sig
Antworten