如何传递要在python中使用的函数名称

时间:2018-11-16 18:37:27

标签: python json python-2.x

我有以下json模板

template.py

from string import Template

test1 = Template(u'''\
{
    "data": {
       "name": "$name"
    }
}
''')

并生成我使用的JSON JSONGen.py

import template

class JSONGen:
    result1 = template.test1.safe_substitute(
        name = 'SomeName'
    )
    print(result1)

现在可以正常工作,它会生成JSON,但我正在尝试创建一个接受模板名称并调用类似名称的函数

JSONGenV2.py

import template

class JSONGenV2:

    def template_func(self, templateName):
        generatedTemplate = template.templateName.safe_substitute(
            name = 'SomeName'
        )

        print (generatedTemplate)

    template_func(test1)

现在我要实现的是使用'templateName'内容作为要调用的模板,因为它现在是

template.templateName.safe_substitute

给我一​​个错误,说“ templateName”不存在,如何将“ templateName”更改为在案例“ test1”中传递的值,所以它将调用

template.test1.safe_substitute

谢谢

2 个答案:

答案 0 :(得分:1)

使用getattr(),用法如下:

  

getattr (对象,名称[,默认])

     

返回 object 的命名属性的值。名称必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x, 'foobar')等效于x.foobar。如果指定的属性不存在,则返回 default (如果提供),否则引发AttributeError

应用于您的代码:

class JSONGenV2:

    def template_func(self, templateName):
        generatedTemplate = getattr(template, templateName).safe_substitute(
            name = 'SomeName'
        )

        print (generatedTemplate)

    template_func(test1)

答案 1 :(得分:0)

您需要一种将模板名称转换为实际模板实例的方法。
我将定义一个字典,其键为模板名称,值为模板实例。

test1 = Template(...)
test2 = Template(...)
templates = {
    'test1': test1
    'test2': test2
}

现在,在您的方法中,您可以使用模板字典来获取您请求的模板的实例:

def template_func(self, templateName):
    generatedTemplate = templates[templateName].safe_substitute(
        name = 'SomeName'
    )
    print (generatedTemplate)

您将这样调用该方法:template_func('test1')