2015-01-09 3 views
0

я создал несколько функцийфункции с другой функцией в качестве параметра

#generate .h file template for class 
def generateHeaderClassTemplate(name): 
    template = open('header.template', 'r') 
    code = parseHeaderTemplate(template.read(), name) 
    template.close() 
    return code 

#generate .cpp file template for class 
def generateImplClassTemplate(name): 
    template = open('class.template', 'r') 
    code = parseImplTemplate(template.read(), name) 
    template.close() 
    return code 

#generate main.cpp file template 
def generateMainTemplate(): 
    template = open('main.template', 'r') 
    code = parseMainTemplate(template.read()) 
    template.close() 
    return code 

Но проблема в том, что все они в основном те же

1. open file 
2. write there some function result 
3. close file 
4. return data 

Так что я хочу, чтобы создать некую универсальную функцию, которая будет имеют функцию как параметр, имя файла как параметр и параметр для функции. А затем функционировать как generateHeaderClassTemplate будет что-то вроде

def generateHeaderClassTemplate(name): 
    return generateTemplate(parseHeaderTemplate, 'header.template', name) 

В основном я хочу функцию как это

def generateTemplate(func, templateFile, name): 
    template = open(templateFile, 'r') 
    code = func(template.read(), name) #or code = func(template.read()) if name was not passed 
    template.close() 
    return code 

Но как заставить его работать, как в комментарии я написал - Если я не сдал name - выполнить func(template.read()) и если я его пройду - выполните func(template.read(), name)?

ответ

1

Вы можете использовать де придираться значения для параметров:

def generateTemplate(func, templateFile, name=None): 

Таким образом, вы можете использовать generateTemplate с или без третьего аргумента:

generateTemplate(parseImplTemplate, 'f') 
generateTemplate(parseMainTemplate, 'f', 'foo) 

И в generateTemplate определение, вы можете сделать что-то вроде:

def generateTemplate(func, templateFile, name=None): 
    template = open(templateFile, 'r') 
    if name: 
     code = func(template.read(), name) 
    else: 
     code = func(template.read()) 
    template.close() 
    return code 
+0

Так что мне нужно проверить наличие параметра 'name'? – lapots

+0

Если вы хотите обработать случай, когда функция функции не указана в вызове функции, да, вы должны проверить 'имя'. – Callahan

1

Использование Python необязательных аргументов

http://www.diveintopython.net/power_of_introspection/optional_arguments.html

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

def info(object, spacing=10, collapse=1): 

распорных по умолчанию 10 и коллапс на 1

+0

Oh! Поэтому я должен заставить 'parseMainTemplate' иметь параметр' name' со значением по умолчанию? – lapots

+0

Таким образом, вы можете объединить все в одну функцию. Одна вещь в python заключается в том, что python имеет функции более высокого порядка, а это означает, что имя может быть даже функцией! Например, если вы используете предложение sorted(), один из параметров, называемый ключ, определяет функцию, которую алгоритм использует для сортировки компонентов одного списка. Возможно, вы можете использовать это, чтобы писать независимые функции, а затем передавать их в более высокий порядок, как вам это нужно. –

+0

Точно, но также рассмотрим пример кода @ fredtantini о том, как обрабатывать случай по умолчанию. – Callahan

1

Возможно, значение по умолчанию для имени параметра поможет вам

def test(a, b = ""): 
    print (a, b) 

test ("hello") 
test ("hello", "world") 

Ваш шаблон methids всегда должны иметь один и тот же прототип, generateTemplateFun(name=""), но при их вызове вы можете пропустить имя часть делая чистый код

+0

Более или менее то же, что и Álvaro Gómez. – Callahan

+0

Jup, я был слишком медленным, когда писал, начал писать без ответов – Johan

+1

Я знаю эту ситуацию, очень разочаровываю. Пока вы пишете answery, вы всегда можете проверить область под вопросом. Он показывает seomthing как «2 новых ответа», даже если вы не обновляете страницу :) – Callahan

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