Возможно ли сгенерировать функцию Python с аргументами во время выполнения?

#python

#python

Вопрос:

Скажем,

У меня есть функция python следующим образом:

 def ooxx(**kwar&s):
    doSomethin&()
    for somethin& in cool:
        yield somethin&
  

Я хотел бы предоставить другую функцию с именованными аргументами для подсказок следующим образом:

 def asdf(ar&1, ar&2, ar&3=1):
    frame = inspect.currentframe()
    ar&s, _, _, values = inspect.&etar&values(frame)
    kwar&s = dict((key, values[key]) for key in ar&s) # convert ar&s list into dictionary form
    return list(ooxx(**kwar&s))
  

Возможно ли иметь какие-то методы для автоматической генерации функции «asdf»? У меня есть множество динамически генерируемых функций ooxx, и я хотел бы иметь соответствующие функции asdf с настраиваемыми именованными аргументами. Не уверен, является ли это правильным требованием или правильным способом кодирования: p

Комментарии:

1. Вашему примеру кода было бы легче следовать, если бы вы использовали более значимые имена переменных.

Ответ №1:

Ваши описания не имеют для меня такого смысла: вы написали действительно подробную функцию, которая делает это:

 def asdf(ar&1, ar&2, ar&3=1):
    return list(ooxx(**locals()))
  

но вы хотите проверить ooxx и каким-то образом составить подходящие имена для asdf аргументов s? Это невозможно, на ooxx нет информации об этом.

Если у вас действительно есть сигнатура и вы хотите создать функцию на ее основе, вам придется прибегнуть к eval или сгенерировать определения функций в файле Python и импортировать его.

Существует также модуль decorator. Вы можете создать функцию с ней следующим образом:

 import decorator
asdf = decorator.FunctionMaker.create(
                'asdf(ar&1, ar&2, ar&3)', # si&nature
                'return ooxx(**locals())', # function body
                {'ooxx' : ooxx}, # context for the function
                ('ar&3', 1)) # default ar&uments
  

Комментарии:

1. Нет. Я уже подготовил генератор функций для генерации ooxx1, ooxx2, ooxx3, …, ooxxN. И я ищу какой-нибудь генератор функций для генерации asdf1, asdf2, asdf3, …, asdfN. Для каждого asdfI количество и имя аргументов различны.