Явно заданная строка документа для метода

#python #nxt

#python #nxt

Вопрос:

Я помогаю поддерживать пакет для python под названием nxt-python. Он использует метаклассы для определения методов объекта управления. Вот метод, который определяет доступные функции:

 class _Meta(type):
    'Metaclass which adds one method for each telegram opcode'

    def __init__(cls, name, bases, dict):
        super(_Meta, cls).__init__(name, bases, dict)
        for opcode in OPCODES:
            poll_func, parse_func = OPCODES[opcode]
            m = _make_poller(opcode, poll_func, parse_func)
            setattr(cls, poll_func.__name__, m)
  

Я хочу иметь возможность добавлять разные строки документа к каждому из этих методов, которые он добавляет. m — это метод, возвращаемый _make_poller(). Есть идеи? Есть ли какой-нибудь способ обойти ограничение python на изменение строк документа?

Комментарии:

1. Вы также можете передать ее в свой _Meta конструктор в dict аргументе как _Meta(cls,name,bases,dict={'__doc__':"""docstring"""}) или call dict.update({'__doc__':"""docstring"""}) перед вашим super вызовом. Теперь у вас есть как минимум 4 варианта.

Ответ №1:

Для простых функций:

 def f():  # for demonstration
    pass

f.__doc__ = "Docstring!"
help(f)
  

Это работает как в python2, так и в python3, для функций с определенными строками документа и без них. Вы также можете сделать = . Обратите внимание, что это __doc__ и не __docs__ .

Для методов необходимо использовать __func__ атрибут метода:

 class MyClass(object):

    def myMethod(self):
        pass

MyClass.myMethod.__func__.__doc__ = "A really cool method"
  

Комментарии:

1. Я попробовал это в методе класса и получил ошибку. Оказывается, что для метода класса, который, я думаю, является тем, чего хочет исходный вопрос, вы хотели бы выполнить: self.method.__func__.__doc__

Ответ №2:

Вы также можете использовать setattr для объекта класса / функции и задать строку документа.

 setattr(foo,'__doc__',"""My Doc string""")