Вы не делаете , потребность ПОЗВОЛИЛА, но Вы обычно хотите она.
ПОЗВОЛЯЮТ, предполагает, что Вы просто делаете стандартную параллельную привязку ни с чем хитрое продолжение. ПОЗВОЛЬТЕ*, вызывает ограничения на компилятор и намекает пользователю, что существует причина, что необходима последовательная привязка. С точки зрения стиль , ПОЗВОЛЬТЕ, лучше, когда Вам не нужны дополнительные ограничения, введенные LET*.
может быть более эффективно использовать, ПОЗВОЛЯЮТ, чем ПОЗВОЛЕННЫЙ* (в зависимости от компилятора, оптимизатора, и т.д.):
(Вышеупомянутые пункты маркированного списка относятся к Схеме, другому диалекту LISP. clisp может отличаться.)
Если у вас хватит смелости, вы можете построить определение функции в виде строки и передать ее оператору exec
. Например:
func = "def f():\n"
if config_f1:
func += " f1()\n"
if config_f2:
func += " f2()\n"
exec func in globals()
На этом этапе у вас должен быть новый глобальный f ()
, который выполняет соответствующие биты кода.
Если 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)
Создайте словарь
fun_dict = {'f1': f1, 'f2': f2}
, затем проанализируйте конфигурацию и запустите функцию из dict:
fun_dict[parsed_name]()
Могут быть разные способы достижения того, чего вы хотите, но для этого вам нужно полностью определить проблему и контекст
один способ может быть таким, а большинство других будет вариант этого, используя 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())
Используйте объекты и шаблон проектирования 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()
Вот как это делается. Никакого «создания функции на лету»