Приостановка вызова функций в Python для последующей передачи (функциональная парадигма) - PullRequest
0 голосов
/ 07 сентября 2010

Я пишу программу командной строки python, которая имеет некоторые взаимозависимые параметры, и я бы хотел, чтобы пользователь мог вводить эти параметры в любом порядке.

В настоящее время я использую библиотеку getopts для анализа параметров командной строки, к сожалению, которые анализируют их по порядку.Я собрал систему логических флагов, чтобы оставить обработку некоторых аргументов командной строки до тех пор, пока не будет обработан тот, от которого они зависят, однако у меня была идея использовать очередь вызовов функций Priority Queue, которая выполнялась бы после выполнения всей командыПараметры строки анализируются.

Я знаю, что Python может хранить функции под именами переменных, но кажется, что она вызывает функцию одновременно.

Например:

help = obj.PrintHelp()
heapq.heappush(commandQ, (0, help))

Распечатает диалоговое окно справки немедленно.Как бы я реализовал свой код так, чтобы он не вызывал PrintHelp () сразу после присвоения ему имени.

РЕДАКТИРОВАТЬ: О, я только что понял, что я помещаю в очередь под названием справки, это моя ошибка.

Спасибо за подсказку по удалению () после PrintHelp.

Что если я хочу теперь вызвать функцию, которая требует больше, чем аргумент self?

myFun = obj.parseFile(path)
heapq.heappush(commandQ, (1, myFun))

Могу ли я просто увеличить кортеж и принять аргумент командной строки?

Ответы [ 3 ]

2 голосов
/ 07 сентября 2010

Если вам heappush, как это:

myFun = obj.parseFile
heapq.heappush(commandQ, (1, myFun, path))

затем, чтобы позже вызвать функцию, вы можете сделать это:

while commandQ:
    x=heapq.heappop(commandQ)
    func=x[1]
    args=x[2:]
    func(*args)

Используйте

help = obj.PrintHelp

без скобок. Это заставляет help ссылаться на функцию. Позже вы можете вызвать функцию с помощью help().

Также обратите внимание (если я правильно понимаю вашу ситуацию), вы можете просто использовать optparse или (если у вас Python2.7 или выше) argparse в стандартной библиотеке для обрабатывать параметры командной строки в любом порядке.

PS. help - это встроенная функция в Python. Присваивание имени переменной help переопределяет встроенное, затрудняя (хотя и не невозможное) доступ к встроенному. Обычно рекомендуется не перезаписывать имена встроенных модулей.

1 голос
/ 07 сентября 2010

Вместо использования getopts я бы предложил использовать optparse ( argparse , если вы используете более новую версию Python): скорее всего, вы получите все, что вам нужно, уже реализовано .

Тем не менее, в вашем примере кода вы фактически вызываете функцию, в то время как вы должны просто получить ее имя:

help = obj.PrintHelp 
heapq.heappush(help, (0, help)) 
0 голосов
/ 08 сентября 2010

Если вы хотите сохранить полный вызов функции в Python, вы можете сделать это одним из двух способов:

# option 1: hold the parameters separately
# I've also skipped saving the function in a 'help' variable'
heapq.heappush(commandQ, (0, obj.PrintHelp, param1, param2))

# later:
command = commandQ[0]
heapq.heappop(commandQ)
command[1](*command[2:]) # call the function (second item) with args (remainder of items)

В качестве альтернативы, вы можете использовать помощник для упаковки аргументов через lambda:

# option 2: build a no-argument anonymous function that knows what arguments
#           to give the real one
# module scope
def makeCall(func, *args):
    return lambda: func(*args)

# now you can:
help = makeCall(obj.PrintHelp, param1, param2)
heapq.heappush(commandQ, (0, help))

Если вам нужны ключевые аргументы, дайте мне знать, и я отредактирую, чтобы позаботиться и о них.

...