Функция, которая определяет функцию в Python
У меня есть программа, которая определяет функцию verboseprint
печатать или не печатать на экран на основе логического значения:
# define verboseprint based on whether we're running in verbose mode or not
if in_verbose_mode:
def verboseprint (*args):
for arg in args:
print arg,
print
print "Done defining verbose print."
else:
# if we're not in verbosemode, do nothing
verboseprint = lambda *a: None
Моя программа использует несколько файлов, и я хотел бы использовать это определение verboseprint во всех них. Все файлы будут переданы in_verbose_mode
логическое значение. Я знаю, что я мог бы просто определить verboseprint
сам по себе в файле, а затем импортировать его во все остальные мои файлы, но мне нужно, чтобы определение функции можно было объявить двумя различными способами на основе логического значения.
Итак, подведем итоги: мне нужна функция, которая может объявлять другую функцию двумя различными способами, которую затем я могу импортировать в несколько файлов.
Любая помощь будет оценена.
2 ответа
Обычно вы не хотите определять функцию таким образом.
И я думаю, что простой способ добиться этого - передать логическое значение в качестве параметра функции и определить поведение на основе этого параметра:
def verboseprint (*args, mode):
if mode == in_verbose_mode:
for arg in args:
print arg,
print
print "Done defining verbose print."
# if we're not in verbosemode, do nothing
##else:
## verboseprint = lambda *a: None
А затем импортируйте эту функцию для использования в других ваших файлах.
Вы должны посмотреть на шаблон дизайна фабрики. Он в основном предназначен для того, чтобы делать то, о чем вы говорите, хотя это было бы с классами, а не функциями. При этом вы можете получить желаемое поведение, имея класс, который возвращает один из двух возможных объектов (в зависимости от вашего логического значения). У них обоих один и тот же метод, но он работает по-разному (как и ваши две функции).
Class A:
def method():
do things one way
Class B:
def method():
do things another way
import A,B
Class Factory:
def __init__(bool):
self.printer = A if bool else B
def do_thing():
self.printer.method()
import Factory
fac = Factory(True)
fac.do_thing() # does A thing
fac = Factor(False)
fac.do_thing() # does B thing