kvichans
Март 21, 2013 14:34:29
Есть ли возможность сформировать для процедуры __doc__ иначе чем литеральной строкой?
Пример. Вместо
Хотелось бы сделать что-то вроде
def fun():
'abc or {}'.format('xyz')
Shaman
Март 21, 2013 14:41:01
Атрибут
Питон позволяет во время исполнения менять почти всё. Для начала можно ознакомиться с модулями new и inspect.
kvichans
Март 21, 2013 15:32:28
У меня на П3.3.0 в справке сказано, что func_doc был переименовал в __doc__.
Попытка изменить __doc__ не удалась: AttributeError: attribute ‘__doc__’ of ‘method’ objects is not writable
Я делал так
class C:
def __init__(self):
self.m.__doc__='other'
def m(self):
'smth'
c=C()
Shaman
Март 21, 2013 15:37:07
Злой Гвидо… Третьего у меня нет - ничего не подскажу.
kvichans
Март 21, 2013 15:42:23
Для простых фунций получается
def fun():
'smth'
print('in fun')
f=fun
print(f.__doc__) # smth
f.__doc__='other'
print(f.__doc__) # other
Тем более странно, что для методов модификация закрыта
Shaman
Март 21, 2013 15:55:33
А.. Метод и функция - это не одно и то же, даже во втором питоне. Можно попытаться отключить функцию от класса, изменить док и подключить обратно.
Атрибут:
mymethod.im_func
Библиотечная функция:
new.instancemethod(function, instance, class)
reclosedev
Март 21, 2013 16:17:32
Менять нужно атрибуты unbound метода, т.е. через класс, а не экземпляр:
class C:
def __init__(self):
C.foo.__doc__ = "modified"
def foo(self):
"original"
c = C()
print(c.foo.__doc__)
# если неизвестен класс
c.__class__.foo.__doc__ = "modified again"
print(c.foo.__doc__)