Seite 1 von 1

Parameteranzahl

Verfasst: Dienstag 19. Januar 2016, 21:56
von harryberlin
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.

Re: Zugriff auf Modul welches bereits aktiv ist

Verfasst: Dienstag 19. Januar 2016, 22:52
von 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.

Re: Zugriff auf Modul welches bereits aktiv ist

Verfasst: Dienstag 19. Januar 2016, 23:01
von harryberlin
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)

Re: Zugriff auf Modul welches bereits aktiv ist

Verfasst: Mittwoch 20. Januar 2016, 00:26
von 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.

Re: Zugriff auf Modul welches bereits aktiv ist

Verfasst: Mittwoch 20. Januar 2016, 18:41
von harryberlin
kannst du ab post von gestern 21:56 einen eigenen thread erstellen?

Re: Zugriff auf Modul welches bereits aktiv ist

Verfasst: Mittwoch 20. Januar 2016, 19:41
von harryberlin
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])

Re: Parameteranzahl

Verfasst: Freitag 22. Januar 2016, 20:41
von harryberlin
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

Re: Parameteranzahl

Verfasst: Freitag 22. Januar 2016, 20:47
von BlackJack
@harryberlin: Wie gesagt: Die *-Magie würde ich sein lassen und stattdessen eine Liste oder ein Tupel übergeben.

Re: Parameteranzahl

Verfasst: Freitag 22. Januar 2016, 20:50
von harryberlin
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?

Re: Parameteranzahl

Verfasst: Freitag 22. Januar 2016, 21:07
von BlackJack
@harryberlin: Es ist ”Magie” und man verbaut sich damit die Funktion durch weitere Positionsargumente erweitern zu können.

Re: Parameteranzahl

Verfasst: Freitag 22. Januar 2016, 21:15
von harryberlin
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?

Re: Parameteranzahl

Verfasst: Freitag 22. Januar 2016, 21:34
von DasIch
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.

Re: Parameteranzahl

Verfasst: Freitag 22. Januar 2016, 22:08
von harryberlin
ok, kann ich verstehn.
auch dass ihr mich jetzt schon darauf hinweisen wollt, damit ich später nicht unnötig frage.