Вопрос по python, dynamic-function – Python - как я могу динамически создать функцию с именем, основанным на строке, считанной из файла?

2

Допустим, у меня есть файл, содержащий строку «unpredictable_words». Я хотел бы прочитать в этой строке, а затем определить функцию следующим образом:

def test_unpredictable_words(self):
    do_important_stuff()

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

Как я могу сделать это?

Я посмотрел немного на этот ответ -https://stackoverflow.com/a/8160676/1701170 - но я не думаю, что он делает то, что я хочу, точно, или, по крайней мере, я не могу понять, что происходит.

Ваш Ответ

2   ответа
1

яются первоклассными правами, вы можете передавать их и назначать переменным. На верхнем уровне вы используетеglobals(), с другой функцией,locals() связать имя:

>>> def foo(x):
...   return x + 1
... 
>>> name = 'unpredictable_words'
>>> 
>>> globals()['test_' + name] = foo
>>> 
>>> test_unpredictable_words(1)
2
>>> 
>>> def some_function():
...   locals()['test_' + name] = foo
...   return test_unpredictable_words(1)
... 
>>> some_function()
2
>>> 

Иногда вы все еще хотите, чтобы функция знала свое имя, чтобы красиво отображаться в трассировке стека. В настоящее времяtest_unpredictable_words появляются какfoo в сообщениях об ошибках. Это нелегко исправить, так как это имя хранится вfoo.func_code.co_name и не может быть изменено.

4
Python 2.7.3 (default, Sep 26 2012, 21:51:14) 
>>> def injected(self):
...     print 'injected'
... 
>>> class A(object):
...     pass
... 
>>> A.injected = injected
>>> a = A()
>>> a.injected()
injected
>>> def func2(self):
...     print 'func2'
... 
>>> setattr(A, 'injected2', func2)
>>> a.injected2()
func2
>>> 
Благодарю. Ваш пример, кажется, работает. Я согласен с вами, что имена функций обычно не должны иметь значения, но я использую Python unittest - он запускает каждую функцию с именем, которое начинается с «test» как отдельный модульный тест, поэтому кажется, что имя функции важно для использования модульный тест. jononomo
Функции в Python являются гражданами первого класса. Имя функции на самом деле не имеет значения, и вы можете назначить одну и ту же функцию нескольким переменным. Таким образом, ваше «Знание, как определить функцию с именованным именем на основе строки» не имеет смысла для меня. Определите любую функцию, а затем внедрите ее под другим именем в свой класс. warvariuc
Я не следую В вашем ответе нет имени функции, которое определяется динамически на основе строки. Введение функции не самая сложная часть для меня. Знание того, как определить функцию с именованным именем на основе строки, является частью, которую я не понимаю. jononomo
Я думаю, что в ответе есть все необходимое, чтобы выполнить то, что вам нужно. У вас есть классA в котором вы хотите ввести новый метод. Извлеките имя метода из файла, определите любую функцию (имя не имеет значения) с необходимым кодом, используйтеsetattr(A, method_name, your_defined_function) ввести новый метод. warvariuc
Хорошо, так что-то вродеsetattr(TestCase, 'test_' + test_function_name, defined_function) warvariuc

Похожие вопросы