[英]function with another function as parameter
我創建了幾個功能
#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)
?
使用python可選參數
http://www.diveintopython.net/power_of_introspection/optional_arguments.html
聲明函數時,可以將默認值傳遞給參數,因此,如果在默認調用時未將其傳遞給函數,它將使用這些參數,例如以下示例:
def info(object, spacing=10, collapse=1):
間隔默認為10,折疊為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
參數名稱的默認值可能會幫助您
def test(a, b = ""):
print (a, b)
test ("hello")
test ("hello", "world")
您的模板方法必須始終具有相同的原型, generateTemplateFun(name="")
但是在調用它們時,您可以跳過名稱部分,從而使代碼更簡潔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.