2017-02-19 2 views
0

Правильно ли этот код в python?Python определяющая функция при условии

def foo(flag): 
    if flag: 
     def bar(): 
      # Somthing 
    else: 
     def bar(): 
      # Somthing else 
    bar() 

foo(True) 
foo(False) 

Если нет, то какой рекомендуемый способ установить поведение некоторой функции (бара) под? состояние?

OK Реальный код следующий

# Building replaceFunc based of ignore_case and use_regexp flags 
if not ignore_case: 
    if not use_regexp: 
     def replaceFunc(string, search, replace): 
      return string.replace(search, replace) 
    else: 
     def replaceFunc(string, search, replace): 
      pattern = re.compile(search) 
      return pattern.sub(replace, string) 
else: 
    if not use_regexp: 
     # There is no standard puthon function for replacing string by ignoring case 
     def replaceFunc(string, search, replace): 
      # implementation from http://stackoverflow.com/questions/919056/case-insensitive-replace 
      return string 
    else: 
     def replaceFunc(string, search, replace): 
      pattern = re.compile(search, re.IGNORECASE) 
      return pattern.sub(replace, string 
+0

Почему бы вам не положить внутреннюю панель? Зачем вам бар? – BlackBear

+0

Почему бы вам не поместить ваш if, иначе внутри 'bar' – ZdaR

+0

Реальный случай слишком сложный. Я попытался установить упрощенный код. В реальном примере бар вызывается внутри цикла. Он также должен быть передан другой функции – ArmanHunanyan

ответ

1

Вот один разумный способ добиться того, что вы хотите:

def bar1(): 
    return 'b1' 

def bar2(): 
    return 'b2' 

def foo(flag): 
    bar = bar2 if flag else bar1 
    return bar() 

print(foo(False)) 
print(foo(True)) 

Одним из преимуществ определения функций bar1() и bar2() вне foo() является то, что они могут быть протестированным.

+0

ОК Спасибо. Это сработает. Есть ли способ избежать ненужных имен. В моем случае они будут bar1 bar2 bar3 bar4. Не выглядит красиво. – ArmanHunanyan

+0

@ArmanHunanyan Конечно, вы можете назвать функции любым способом. Дайте им значащие имена - не 'bar1',' bar2' и т. Д. – FMc

Смежные вопросы