Уведомления

Группа в Telegram: @pythonsu

#1 Март 21, 2013 14:34:29

kvichans
От: Москва
Зарегистрирован: 2013-03-07
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Как динамически заполнить help-строку процедуры

Есть ли возможность сформировать для процедуры __doc__ иначе чем литеральной строкой?
Пример. Вместо

def fun():
  'abc or xyz'
Хотелось бы сделать что-то вроде
def fun():
  'abc or {}'.format('xyz')



Py3.3x32, Py3.3x64, Win7x64-HmEx-ru(1600x900), TC8.0x32, SynWrite 5.8

Отредактировано kvichans (Март 21, 2013 14:35:05)

Офлайн

#2 Март 21, 2013 14:41:01

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Как динамически заполнить help-строку процедуры

Атрибут

fun.func_doc
Питон позволяет во время исполнения менять почти всё. Для начала можно ознакомиться с модулями new и inspect.

Офлайн

#3 Март 21, 2013 15:32:28

kvichans
От: Москва
Зарегистрирован: 2013-03-07
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Как динамически заполнить help-строку процедуры

У меня на П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()



Py3.3x32, Py3.3x64, Win7x64-HmEx-ru(1600x900), TC8.0x32, SynWrite 5.8

Отредактировано kvichans (Март 21, 2013 15:43:54)

Офлайн

#4 Март 21, 2013 15:37:07

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Как динамически заполнить help-строку процедуры

Злой Гвидо… Третьего у меня нет - ничего не подскажу.

Офлайн

#5 Март 21, 2013 15:42:23

kvichans
От: Москва
Зарегистрирован: 2013-03-07
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Как динамически заполнить help-строку процедуры

Для простых фунций получается

def fun():
  'smth'
  print('in fun')
f=fun
print(f.__doc__) # smth
f.__doc__='other'
print(f.__doc__) # other
Тем более странно, что для методов модификация закрыта



Py3.3x32, Py3.3x64, Win7x64-HmEx-ru(1600x900), TC8.0x32, SynWrite 5.8

Отредактировано kvichans (Март 21, 2013 15:42:46)

Офлайн

#6 Март 21, 2013 15:55:33

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Как динамически заполнить help-строку процедуры

А.. Метод и функция - это не одно и то же, даже во втором питоне. Можно попытаться отключить функцию от класса, изменить док и подключить обратно.

Атрибут:
mymethod.im_func

Библиотечная функция:
new.instancemethod(function, instance, class)

Отредактировано Shaman (Март 21, 2013 16:00:33)

Офлайн

#7 Март 21, 2013 16:17:32

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Как динамически заполнить help-строку процедуры

Менять нужно атрибуты 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__)

Офлайн

#8 Март 21, 2013 16:59:14

kvichans
От: Москва
Зарегистрирован: 2013-03-07
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Как динамически заполнить help-строку процедуры

reclosedev Спасибо



Py3.3x32, Py3.3x64, Win7x64-HmEx-ru(1600x900), TC8.0x32, SynWrite 5.8

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version