Python, создающий функции на лету

Вы не делаете , потребность ПОЗВОЛИЛА, но Вы обычно хотите она.

ПОЗВОЛЯЮТ, предполагает, что Вы просто делаете стандартную параллельную привязку ни с чем хитрое продолжение. ПОЗВОЛЬТЕ*, вызывает ограничения на компилятор и намекает пользователю, что существует причина, что необходима последовательная привязка. С точки зрения стиль , ПОЗВОЛЬТЕ, лучше, когда Вам не нужны дополнительные ограничения, введенные LET*.

может быть более эффективно использовать, ПОЗВОЛЯЮТ, чем ПОЗВОЛЕННЫЙ* (в зависимости от компилятора, оптимизатора, и т.д.):

  • параллельная привязка может быть выполнена в параллели (но я не знаю, делают ли какие-либо системы LISP на самом деле это, и формы init должны все еще быть выполнены последовательно)
  • , параллельная привязка создает единственную новую среду (объем) для всей привязки. Последовательная привязка создает новые вложенные условия для каждой привязки. Параллельное использование привязки меньше памяти и имеет более быстрый переменный поиск .

(Вышеупомянутые пункты маркированного списка относятся к Схеме, другому диалекту LISP. clisp может отличаться.)

5
задан SilentGhost 20 October 2009 в 10:22
поделиться

5 ответов

Если у вас хватит смелости, вы можете построить определение функции в виде строки и передать ее оператору exec . Например:

func = "def f():\n"
if config_f1:
    func += " f1()\n"
if config_f2:
    func += " f2()\n"
exec func in globals()

На этом этапе у вас должен быть новый глобальный f () , который выполняет соответствующие биты кода.

3
ответ дан 14 December 2019 в 01:11
поделиться

Если f1 , f2 и т. Д. Являются функциями с побочными эффектами, то вам следует использовать явный цикл for (без причудливое решение карты ). Может быть, вам нужно что-то подобное?

configurations = {
  'config_1': (f1, f2, f3),
  'config_2': (f1, f2),
}

def f(config='config_1'):
    for op in configurations[config]:
        op()

Если f1 , f2 и т. Д. Получают аргументы, то, возможно, это более подходящее определение f :

def f(config, *args, **kwargs):
    for op in configurations[config]:
        op(*args, **kwargs)
3
ответ дан 14 December 2019 в 01:11
поделиться

Создайте словарь

fun_dict = {'f1': f1, 'f2': f2}

, затем проанализируйте конфигурацию и запустите функцию из dict:

fun_dict[parsed_name]()
1
ответ дан 14 December 2019 в 01:11
поделиться

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

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

def f1(): print "f1"
def f2(): print "f2"
def f3(): print "f3"

def f(fList):
    for f in fList: globals()[f]()

f(["f1", "f2"])
f("f1 f3 f1 f3 f2 f1 f3 f2".split())
1
ответ дан 14 December 2019 в 01:11
поделиться

Используйте объекты и шаблон проектирования Command.

class Function( object ):
    pass

class F1( Function ):
    def __call__( self ):
        whatever `f1` used to do

 class F2( Function ):
    def __call__( self ):
        whatever `f1` used to do

 class Sequence( Function ):
     def __init__( self, *someList ):
         self.sequence= someList
     def __call__( self ):
         for f in self.sequence:
             f()

f= myDynamicOperation( F1(), F2(), F3() )
f()

Вот как это делается. Никакого «создания функции на лету»

1
ответ дан 14 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: