Вопрос по python, dynamic-function – Python - как я могу динамически создать функцию с именем, основанным на строке, считанной из файла?
Допустим, у меня есть файл, содержащий строку «unpredictable_words». Я хотел бы прочитать в этой строке, а затем определить функцию следующим образом:
def test_unpredictable_words(self):
do_important_stuff()
Затем я хотел бы внедрить эту функцию в определение класса, чтобы эту функцию можно было вызывать в любых экземплярах этого класса.
Как я могу сделать это?
Я посмотрел немного на этот ответ -https://stackoverflow.com/a/8160676/1701170 - но я не думаю, что он делает то, что я хочу, точно, или, по крайней мере, я не могу понять, что происходит.
яются первоклассными правами, вы можете передавать их и назначать переменным. На верхнем уровне вы используете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
и не может быть изменено.
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
>>>
A
в котором вы хотите ввести новый метод. Извлеките имя метода из файла, определите любую функцию (имя не имеет значения) с необходимым кодом, используйтеsetattr(A, method_name, your_defined_function)
ввести новый метод.
warvariuc
setattr(TestCase, 'test_' + test_function_name, defined_function)
warvariuc