doc для определенных атрибутов __getattr__

Мне нужно настроить __getattr__ для вызова другой функции для чтения.

Это работает хорошо, за исключением того, что help(object.attr) не работает. Этот код используется в интерактивной среде, поэтому функция help() становится для нас важной.

Есть ли лучший дизайн для достижения тех же функций, но с хорошей работой help().


person Forest Yang    schedule 03.02.2012    source источник


Ответы (2)


Текст, который используется для «помощи», действительно является атрибутом «__doc__» объекта. Дело в том, что в зависимости от объекта, который у вас есть, вы не можете просто установить на него атрибут __doc__.

Если вам нужно, чтобы "help(object.attr)" работало (а не чтобы help(object) показывало вам все возможные атрибуты), это немного проще - вы должны только убедиться, что все, что возвращает __getattr__, имеет правильно установленную строку документации.

Поскольку «это не работает», я предполагаю, что вы возвращаете внутренние результаты некоторого вызова функции, например, в этом фрагменте:

def __getattr__(self, attr):
    if attr == "foo":
        #function "foo" returns an integer
        return foo()
    ...

Если бы вы просто вернули саму функцию "foo", не вызывая ее, ее строка документации отобразилась бы нормально.

Что можно сделать, так это обернуть возвращаемое значение в __getattr__ как объект динамически созданного класса, который содержит правильную строку документации, поэтому попробуйте использовать что-то вроде этого:

def __getattr__(self, attr):
    if attr == "foo":
        #function "foo" returns an (whatever object)
        result = foo()
        res_type = type(result)
        wrapper_dict = res_type.__dict__.copy()
        wrapper_dict["__doc__"] = foo.__doc__ #(or "<desired documentation for this attribute>")
        new_type = type(res_type.__name__, (res_type,), wrapper_dict)
        # I will leave it as an "exercise for the reader" if the 
        # constructor of the returned object can't take an object
        # of the same instance (python native data types, like int, float, list, can)
        new_result = new_type(result)
    elif ...: 
        ...
    return new_result

Это должно работать - если только я не ошибся в мотиве, почему хел не работает в первую очередь - если это так, пожалуйста, приведите пример того, что вы возвращаете из __getattr__.

person jsbueno    schedule 04.02.2012
comment
Спасибо, в моем случае работает. Все атрибуты в getattr возвращают собственные типы данных Python. - person Forest Yang; 11.02.2012

Вы можете превратить атрибут в свойство. Свойство будет автоматически использовать строку документации метода-получателя как свою собственную. В качестве альтернативы вы можете указать аргумент doc для property().

person NPE    schedule 03.02.2012
comment
Внутри getattr находится вызов функции, использующий attr в качестве параметра. Возможно ли это с помощью свойства ()? Этот атрибут является динамическим, неизвестным при создании объекта. - person Forest Yang; 03.02.2012