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 и не может быть изменено.

Другие вопросы по тегам