Как изменить параметры функции во время выполнения? - PullRequest
2 голосов
/ 26 июля 2011

Я новичок и использую Python 2.7.Я хочу, чтобы параметры определений были изменяемыми, чтобы я мог контролировать паузу и вывод строки на лету.Это возможно?Я прочитал кое-что о ветке, но, похоже, больше о выполнении двух задач одновременно.Я хочу, чтобы связь между двумя задачами во время выполнения.

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

Любое решение или ссылка на документацию очень ценится.Спасибо за ваше время!/ Карл

Ответы [ 3 ]

3 голосов
/ 26 июля 2011

Темы для одновременной работы. Я полагаю, что если вы просто переделаете свой код, вы получите желаемый эффект. Подумайте об удалении предложения while из вашей функции и поместите его снаружи:

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

И где-то вы вызываете эту функцию:

while True:
    stringToWrite, pauseSeconds = gatherSomeInformation()
    writeAndPause(stringToWrite, pauseSeconds)
0 голосов
/ 26 июля 2011

Помогает ли это вам?

В нем используются характеристики определения аргумента по умолчанию и тот факт, что список - это не переменная, а набор ссылок, в моем коде только один (кратко)

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()

результат

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
0 голосов
/ 26 июля 2011

@ Константиний прав: ответ почти наверняка состоит в том, чтобы переработать код, чтобы вам не нужно было что-то эзотерическое.

Я опишу другой способ сделать это просто для удовольствия. Если вы действительно хотите сохранить цикл while внутри функции, вы можете сделать это с выражением доходности

Например:

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

Это можно использовать следующим образом:

# 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'

Теперь, когда вы это увидели, забудьте об этом и сделайте то, что сказал @Constantinius.

...