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