Найти - Пользователи
Полная версия: Как динамически заполнить help-строку процедуры
Начало » Python для новичков » Как динамически заполнить help-строку процедуры
1
kvichans
Есть ли возможность сформировать для процедуры __doc__ иначе чем литеральной строкой?
Пример. Вместо
def fun():
  'abc or xyz'
Хотелось бы сделать что-то вроде
def fun():
  'abc or {}'.format('xyz')
Shaman
Атрибут
fun.func_doc
Питон позволяет во время исполнения менять почти всё. Для начала можно ознакомиться с модулями new и inspect.
kvichans
У меня на П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
Злой Гвидо… Третьего у меня нет - ничего не подскажу.
kvichans
Для простых фунций получается
def fun():
  'smth'
  print('in fun')
f=fun
print(f.__doc__) # smth
f.__doc__='other'
print(f.__doc__) # other
Тем более странно, что для методов модификация закрыта
Shaman
А.. Метод и функция - это не одно и то же, даже во втором питоне. Можно попытаться отключить функцию от класса, изменить док и подключить обратно.

Атрибут:
mymethod.im_func

Библиотечная функция:
new.instancemethod(function, instance, class)
reclosedev
Менять нужно атрибуты 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__)
kvichans
reclosedev Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB