документ для __getattr__ определенных атрибутов - PullRequest
5 голосов
/ 03 февраля 2012

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

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

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

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Текст, который используется для «помощи», действительно является атрибутом «__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

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

1 голос
/ 03 февраля 2012

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

...