Функция, которая определяет функцию в 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
Другие вопросы по тегам