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