Python устанавливает строку документации и получает имя метода динамически генерируемого метода класса
Я пытаюсь получить / установить имя и строку документации динамически создаваемых методов класса следующим образом, но у меня возникают проблемы с выяснением, как именно это сделать:
import sys
import inspect
class test(object):
pass
@classmethod
def genericFunc(cls, **kwargs):
print "function:", (inspect.stack()[0][3])
print "kwargs:", kwargs
function_list = ['myF1', 'myF2']
for func in function_list:
setattr(test, func, genericFunc)
#set docstring for func here?
if __name__ == '__main__':
x = test()
print "docstring:", x.myF1.__doc__
x.myF1(arg1="foo")
y = test()
print "docstring:", y.myF2.__doc__
y.myF2(arg1="foo", arg2="bar")
sys.exit()
В настоящее время вывод:
docstring: None
function: genericFunc
kwargs: {'arg1': 'foo'}
docstring: None
function: genericFunc
kwargs: {'arg1': 'foo', 'arg2': 'bar'}
Что я хотел бы иметь:
docstring: description of myF1
function: myF1
kwargs: {'arg1': 'foo'}
docstring: description of myF2
function: myF2
kwargs: {'arg1': 'foo', 'arg2': 'bar'}
В цикле я пытался сделать setattr(test.func, "__doc__", "description of %s" % func)
, что привело к исключению AttributeError (у объекта типа 'test' нет атрибута 'func'), и если я жестко закодировал 'test.myF1' вместо 'test.func', я получил бы AttributeError для атрибута '__doc__'
"метод экземпляра" недоступен для записи.
Наконец, inspect.stack() возвращает "genericFunc" вместо динамического имени функции ("myF1" или "myF2"), возможно ли получить / установить последнее, чтобы я мог проверить значение метода __name__
в рамках genericFunc выполнять определенные действия в зависимости от его значения?
1 ответ
Ваша общая функция не имеет строки документации. Это прекрасно работает для меня, когда я добавляю строку документации:
import inspect
class test(object):
pass
@classmethod
def genericFunc(cls, **kwargs):
""" I'm a docstring"""
print "function:", (inspect.stack()[0][3])
print "kwargs:", kwargs
function_list = ['myF1', 'myF2']
for func in function_list:
setattr(test, func, genericFunc)
#set docstring for func here?
if __name__ == '__main__':
x = test()
print "docstring:", x.myF1.__doc__
x.myF1(arg1="foo")
y = test()
print "docstring:", y.myF2.__doc__
y.myF2(arg1="foo", arg2="bar")
Кроме того, почему sys.exit() в конце? В результате я получаю:
docstring: I'm a docstring
function: genericFunc
kwargs: {'arg1': 'foo'}
docstring: I'm a docstring
function: genericFunc
kwargs: {'arg1': 'foo', 'arg2': 'bar'}