2014-12-28 3 views
0

Как найти аргумент функции функции, вызывающей функцию callback, из callback?(python) Поиск аргумента родительской функции из обратного вызова

Приведенный ниже код (неполный) инициирует поток аудио, который вызывает функцию обратного вызова. Он использует pyaudio.

Прямо сейчас в функции callback есть жестко закодированные вещи. Я пытаюсь избавиться от них.

Я прочитал документ pyaudio и, похоже, не могу передать дополнительные аргументы функции callback. Я читал о модуле python inspect, его getsource или getouterframes, который, казалось, был интересен для меня, чтобы надеяться получить аргумент, заданный функции PlayStream, но это никуда не привело.

Как я могу ссылаться на аргумент SoundGeneratorObject с точностью до callback?

спасибо.

def PlayStream(SoundGeneratorObject): 
    p = pyaudio.PyAudio() 
    stream = p.open(format = p.get_format_from_width(SoundGeneratorObject.WIDTH), 
       channels = SoundGeneratorObject.CHANNELS, 
       rate = SoundGeneratorObject.BITRATE, 
       frames_per_buffer = SoundGeneratorObject.CHUNKSIZE, 
       output = True, 
       stream_callback = callback) 
    stream.start_stream() 
    while stream.is_active(): 
     time.sleep(0.1) 
    stream.stop_stream() 
    stream.close() 
    p.terminate() 

def callback(in_data, frame_count, time_info, status_flags): 
    signal = waves.next() 
    return (signal, pyaudio.paContinue) 

waves = SoundGenerator() 
PlayStream(waves) 
+0

Рассматривали ли вы назвать 'SoundgeneratorObje ct' -> 'sound_generator_object', когда это аргумент? Я там смутился :) –

+0

ha, хорошо, сделаю - новичок программист здесь! спасибо за подсказку – grabaldam

+0

Вы можете выбрать любое соглашение, пока вы ** держите ** его и не меняете назад и вперед :) –

ответ

0

Можете ли вы сделать что-то подобное, чтобы создать область для обратного вызова, которое вы проходите?

def callback_maker(waves): 
    def callback(in_data, frame_count, time_info, status_flags): 
     # do stuff (waves is in scope) 
     signal = waves.next() 
     return (signal, pyaudio.paContinue) 
    return callback 

Если вы можете использовать его как это:

stream = p.open(format = p.get_format_from_width(SoundGeneratorObject.WIDTH), 
       channels = SoundGeneratorObject.CHANNELS, 
       rate = SoundGeneratorObject.BITRATE, 
       frames_per_buffer = SoundGeneratorObject.CHUNKSIZE, 
       output = True, 
       stream_callback = callback_maker(SoundGeneratorObject)) 
+0

Это сработало! Большое спасибо! Я новичок в кодировании, только начинаю понимать основные понятия, ваша помощь очень ценится! – grabaldam

+0

@grabaldam Нет проблем, просто убедитесь, что вы знаете, почему он работает :) –

+1

Да, я понимаю логику! Спасибо! – grabaldam

1

Хотя ответ был принят, я хотел бы показать альтернативу, как, насколько технически вы можете получить доступ к аргументу от родительской функции по используя инспектировать и глобалам(), этот пример будет работать:

import inspect 

# as argument 
SoundGeneratorObject = 'Hello World' 

def PlayStream(SoundGeneratorObject): 
    a, b, c = 8, 9, 10 
    print "do a callback" 
    callback(a, b, c) 

def callback(a, b, c): 
    print a, b, c 
    # inspect.stack[1][3] can get the function name that called the callback 
    # inner globals then access to the function by its name 
    # func_code.co_varnames will then get the argument name from the function 
    # since you only have 1 argument, that's why I use index [0] 
    # the outer globals will then access the argument value by its name 
    print globals()[globals()[inspect.stack()[1][3]].func_code.co_varnames[0]] 

# call the parent function 
PlayStream(SoundGeneratorObject) 

do a callback 
8 9 10 
Hello World # successfully get the argument value 

 Смежные вопросы

  • Нет связанных вопросов^_^