Piszę lekką klasę, której atrybuty mają być publicznie dostępne i tylko czasami nadpisywane w określonych instancjach. W języku Python nie ma przepisu na tworzenie ciągów dokumentów dla atrybutów klas, ani żadnego innego rodzaju atrybutów. Jaki jest oczekiwany i obsługiwany sposób udokumentowania tych atrybutów, czy powinien istnieć? Obecnie robię takie rzeczy:
class Albatross(object):
"""A bird with a flight speed exceeding that of an unladen swallow.
Attributes:
"""
flight_speed = 691
__doc__ += """
flight_speed (691)
The maximum speed that such a bird can attain.
"""
nesting_grounds = "Raymond Luxury-Yacht"
__doc__ += """
nesting_grounds ("Raymond Luxury-Yacht")
The locale where these birds congregate to reproduce.
"""
def __init__(self, **keyargs):
"""Initialize the Albatross from the keyword arguments."""
self.__dict__.update(keyargs)
Spowoduje to, że dokumentacja klasy będzie zawierała początkową standardową sekcję docstringową, a także wiersze dodane dla każdego atrybutu poprzez rozszerzone przypisanie do __doc__
.
Chociaż ten styl nie wydaje się być wyraźnie zabroniony w wytycznych dotyczących stylów dokumentów , nie jest on również wspomniany jako opcja. Zaletą jest to, że zapewnia sposób dokumentowania atrybutów wraz z ich definicjami, jednocześnie tworząc prezentowalny dokument klasy i unikając konieczności pisania komentarzy, które powtarzają informacje z dokumentu. Nadal jestem trochę poirytowany, że muszę dwukrotnie pisać atrybuty; Rozważam użycie reprezentacji ciągów wartości w dokumencie, aby przynajmniej uniknąć powielania wartości domyślnych.
Czy to ohydne naruszenie konwencji wspólnoty ad hoc? Czy to w porządku? Czy jest lepszy sposób? Na przykład, możliwe jest utworzenie słownika zawierającego wartości i ciągi dokumentacyjne dla atrybutów, a następnie dodanie zawartości do klasy __dict__
i napisów dokumentacyjnych na końcu deklaracji klasy; zmniejszyłoby to potrzebę dwukrotnego wpisywania nazw i wartości atrybutów. edycja : ten ostatni pomysł jest, myślę, w rzeczywistości niemożliwy, przynajmniej nie bez dynamicznego budowania całej klasy z danych, co wydaje się naprawdę złym pomysłem, chyba że istnieje inny powód, aby to zrobić.
Jestem całkiem nowy w Pythonie i nadal pracuję nad szczegółami stylu kodowania, więc niepowiązane krytyki są również mile widziane.
źródło
attribute doc string
wspomniany w PEP 257, który nie jest dobrze znany i wydaje się trudny do znalezienia, który może odpowiedzieć na pytanie PO i jest obsługiwany przez niektóre narzędzia źródłowe. To nie jest opinia. To fakt, część języka i właściwie to, czego chce OP.Odpowiedzi:
Aby uniknąć nieporozumień: termin właściwość ma określone znaczenie w Pythonie. Mówisz o tym, co nazywamy atrybutami klas . Ponieważ zawsze działają na nie poprzez swoją klasę, uważam, że sensowne jest udokumentowanie ich w dokumentacji klasy. Coś takiego:
Myślę, że jest to o wiele łatwiejsze dla oczu niż podejście z twojego przykładu. Gdybym naprawdę chciał, aby kopia wartości atrybutów pojawiła się w ciągu dokumentacyjnym, umieściłbym je obok lub poniżej opisu każdego atrybutu.
Należy pamiętać, że w Pythonie ciągi dokumentacyjne są rzeczywistymi składnikami obiektów, które dokumentują, a nie tylko adnotacjami do kodu źródłowego. Ponieważ zmienne atrybutów klasy same w sobie nie są obiektami, ale odwołaniami do obiektów, nie mają możliwości przechowywania własnych ciągów dokumentacyjnych. Wydaje mi się, że można by podać argumenty dla ciągów dokumentacyjnych w referencjach, być może w celu opisania „co tu powinno się znaleźć” zamiast „co właściwie tu jest”, ale wydaje mi się, że dość łatwo jest to zrobić w zawierającym ciąg dokumentacyjny klasy.
źródło
flight_speed = 691; flight_speed.__doc__ = "blah blah"
. Myślę, że właśnie o tym wspominasz w swojej edycji . Niestety, nie działa to w przypadku instancji (większości?) Typów wbudowanych (jakint
w tym przykładzie). Działa w przypadku wystąpień typów zdefiniowanych przez użytkownika. =========== Właściwie istniał PEP (przepraszam, zapomnij o numerze), który proponował dodanie ciągów dokumentacji dla atrybutów klas / modułów, ale został odrzucony, ponieważ nie mogli znaleźć sposobu, aby to wyjaśnić czy ciągi dokumentacyjne dotyczyły poprzednich czy następnych atrybutów.Cytujesz PEP257: Docstring Conventions, w sekcji Co to jest dokumentacja, o której mowa:
I jest to wyjaśnione bardziej szczegółowo w PEP 258: Dokumentacja atrybutów. Jak wyjaśniono powyżej ʇsәɹoɈ. atrybut nie jest obiektem, który może posiadać __doc__, więc nie pojawią się w
help()
ani w pydoc. Te dokumenty mogą być używane tylko do generowanej dokumentacji.Są używane w Sphinx z dyrektywą autoattribute
Sphinx może używać komentarzy w wierszu przed przydziałem lub specjalnego komentarza po przydziale lub ciągu dokumentu po definicji, który będzie automatycznie dokumentowany.
źródło
W tym celu możesz nadużywać właściwości. Właściwości zawierają getter, setter, deleter i docstring . Naiwnie byłoby to bardzo rozwlekłe:
Wtedy będziesz miał ciąg dokumentów należący do Cx:
Robienie tego dla wielu atrybutów jest kłopotliwe, ale możesz sobie wyobrazić funkcję pomocniczą myprop:
Następnie wywołanie interaktywności Pythona
help
da:co myślę, że powinno być tym, czego szukasz.
Edycja : teraz zdaję sobie sprawę, że być może możemy
myprop
w ogóle uniknąć konieczności przekazywania pierwszego argumentu , ponieważ nazwa wewnętrzna nie ma znaczenia. Jeśli kolejne wywołaniamyprop
mogą w jakiś sposób komunikować się ze sobą, może automatycznie zdecydować o długiej i mało prawdopodobnej nazwie atrybutu wewnętrznego. Jestem pewien, że istnieją sposoby na wdrożenie tego, ale nie jestem pewien, czy są tego warte.źródło