Как передать имя функции для использования в Python - PullRequest
0 голосов
/ 16 ноября 2018

у меня есть следующий шаблон 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 голосов
/ 16 ноября 2018

Использование getattr(), использование как это:

getattr (объект, имя [, по умолчанию])

Возвращает значение именованного атрибута объекта . имя должно быть строкой. Если строка является именем одного из атрибутов объекта, результатом является значение этого атрибута. Например, 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)
0 голосов
/ 16 ноября 2018

Вам нужен способ преобразования имени шаблона в экземпляр фактического шаблона.
Я бы определил словарь с ключами, являющимися именем шаблона, и значением, являющимся экземпляром шаблона.

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')

...