web-dev-qa-db-fra.com

python threading.Timer: comment passer l'argument au rappel?

Mon code:

    import threading

def hello(arg, kargs):
    print arg

t = threading.Timer(2, hello, "bb")
t.start()

while 1:
    pass

L'impression est juste:

b

Comment passer un argument au rappel? Que signifie le kargs?

31
Bin Chen

Timer prend un tableau d'arguments et un dict d'arguments de mots clés, vous devez donc passer un tableau:

import threading

def hello(arg):
    print arg

t = threading.Timer(2, hello, ["bb"])
t.start()

while 1:
    pass

Vous voyez "b" parce que vous ne lui donnez pas de tableau, donc il traite "bb" an un itérable; c'est essentiellement comme si vous lui aviez donné ["b", "b"].

kwargs est pour les arguments des mots clés, par exemple:

t = threading.Timer(2, hello, ["bb"], {arg: 1})

Voir http://docs.python.org/release/1.5.1p1/tut/keywordArgs.html pour plus d'informations sur les arguments des mots clés.

52
Glenn Maynard

Le troisième argument de Timer est une séquence. Puisque vous passez "bb" comme séquence, hello obtient les éléments de cette séquence ("b" et "b") comme arguments séparés (arg et kargs). Mettez "bb" dans une liste et hello obtiendra la chaîne comme premier argument.

t = threading.Timer(2, hello, ["bb"])

Quant aux paramètres de hello, vous voulez probablement dire:

def hello(*args, **kwargs):

Le sens de **kwargs est couvert dans le queston " Que signifient * args et ** kwargs? "

4
outis