Python - как я могу динамически создать функцию с именем, основанным на строке, считанной из файла?
Допустим, у меня есть файл, содержащий строку "unpredictable_words". Я хотел бы прочитать в этой строке, а затем определить функцию следующим образом:
def test_unpredictable_words(self):
do_important_stuff()
Затем я хотел бы внедрить эту функцию в определение класса, чтобы эту функцию можно было вызывать в любых экземплярах этого класса.
Как я могу сделать это?
Я немного посмотрел на этот ответ - /questions/46703299/dinamicheski-sozdavat-funktsiyu-s-opredelennyim-imenem/46703305#46703305 - но я не думаю, что он делает то, что я хочу, точно, или, по крайней мере, я не могу понять, что происходит.
2 ответа
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
>>>
Вам не нужно определять функцию под одним истинным именем. Функции являются первоклассными правами, вы можете передавать их и назначать переменным. На верхнем уровне вы используете 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
и не может быть изменено.