¿Cómo cambiar los parámetros de la función durante el tiempo de ejecución?

StackOverflow https://stackoverflow.com/questions/6830446

  •  27-10-2019
  •  | 
  •  

Pregunta

Soy un principiante y uso Python 2.7. Quiero que los parámetros de definiciones sean cambiantes para poder controlar la salida de pausa y cadena en la mosca. es posible? He leído algunas cosas de hilo, pero parece ser más de ejecutar dos tareas al mismo tiempo. Quiero comunicación entre las dos tareas durante el tiempo de ejecución.

    def writeAndPause(stringToWrite,pauseSeconds)
        while True:
            print stringToWrite
            sleep(pauseSeconds)

Cualquier solución o enlace a la documentación es muy apreciada. ¡Gracias por tu tiempo! /Karl

¿Fue útil?

Solución

Los hilos son para trabajo simultáneo. Supongo que si solo rediseques tu código, tendrás el efecto que deseas. Considere eliminar el while cláusula de su función y colóquela afuera:

def writeAndPause(stringToWrite,pauseSeconds)
    print stringToWrite
    sleep(pauseSeconds)

Y en algún lugar que llame a esta función:

while True:
    stringToWrite, pauseSeconds = gatherSomeInformation()
    writeAndPause(stringToWrite, pauseSeconds)

Otros consejos

@Constantinius tiene razón: la respuesta es casi seguramente rediseñar su código para que no necesite hacer algo esotérico.

Describiré otra forma de hacerlo puramente por diversión. Si realmente quería mantener eso mientras el bucle dentro de la función, puede hacerlo con un Rendimiento de expresión

Por ejemplo:

def writeAndPause():
    while True:
        stringToWrite, pauseSeconds = yield
        print stringToWrite
        sleep(pauseSeconds)

Esto se puede usar de la siguiente manera:

# create the generator
writer = writeAndPause()
# start the generator
writer.next()
# resume execution and send new values into generator
writer.send(('start string', 10))
'start string'
# resume execution and send another set of new values into generator
writer.send(('new string', 20))
'new string'

Ahora que lo has visto, olvídalo y haz lo que dijo @Constantinius.

¿Esto te ayuda?

Aprovecha las características de la definición de argumento predeterminado y el hecho de que una lista no es una variable sino una colección de referencia, en mi código solo una (en breve dicho)

from time import sleep,time

stringToWrite = [None]
pauseSeconds = [0]

def writeAndPause(stw = stringToWrite, pz = pauseSeconds, keep = [time()]):
        if stw[0]:
            print stw[0]
        else:
            print 'START'
        print '  having waited ',time()-keep[0],'seconds,    must wait',pz[0],'seconds'
        keep[0] = time()
        sleep(pz[0])


writeAndPause()


for a,b in (('first',1),('second',2.05),('third',3.4),('fourth',0.88),
            ('BANANA',0.2),('APPLE',1.5),
            ('PEAR',0.77),('CHERRY',4),
            ('ORANGE',0.1),('NUT',6),
            ('APRICOT',0.56),('PLUM',2.5)):

    stringToWrite[0] = a
    pauseSeconds[0] = b
    writeAndPause()

resultado

START
  having waited  0.0310001373291 seconds,    must wait 0 seconds
first
  having waited  0.0320000648499 seconds,    must wait 1 seconds
second
  having waited  1.01600003242 seconds,    must wait 2.05 seconds
third
  having waited  2.15600013733 seconds,    must wait 3.4 seconds
fourth
  having waited  3.42100000381 seconds,    must wait 0.88 seconds
BANANA
  having waited  0.905999898911 seconds,    must wait 0.2 seconds
APPLE
  having waited  0.266000032425 seconds,    must wait 1.5 seconds
PEAR
  having waited  1.51499986649 seconds,    must wait 0.77 seconds
CHERRY
  having waited  0.796999931335 seconds,    must wait 4 seconds
ORANGE
  having waited  4.03200006485 seconds,    must wait 0.1 seconds
NUT
  having waited  0.140000104904 seconds,    must wait 6 seconds
APRICOT
  having waited  6.03099989891 seconds,    must wait 0.56 seconds
PLUM
  having waited  0.765000104904 seconds,    must wait 2.5 seconds
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top