Estou escrevendo uma classe leve cujos atributos devem ser publicamente acessíveis e apenas às vezes substituídos em instanciações específicas. Não há provisão na linguagem Python para a criação de docstrings para atributos de classe, ou qualquer tipo de atributo, para esse assunto. Qual é a forma esperada e suportada, caso haja uma, para documentar esses atributos? Atualmente estou fazendo este tipo de coisa:
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)
Isso resultará em docstring da classe contendo a seção docstring padrão inicial, bem como as linhas adicionadas para cada atributo por meio de atribuição aumentada para __doc__
.
Embora esse estilo não pareça ser expressamente proibido nas diretrizes de estilo do docstring , ele também não é mencionado como uma opção. A vantagem aqui é que ele fornece uma maneira de documentar os atributos junto com suas definições, enquanto ainda cria uma docstring de classe apresentável e evita a necessidade de escrever comentários que reiteram as informações da docstring. Ainda estou meio chateado por ter de escrever os atributos duas vezes; Estou pensando em usar as representações de string dos valores no docstring para, pelo menos, evitar a duplicação dos valores padrão.
Esta é uma violação hedionda das convenções da comunidade ad hoc? Está tudo bem? Existe uma maneira melhor? Por exemplo, é possível criar um dicionário contendo valores e docstrings para os atributos e depois adicionar o conteúdo à classe __dict__
e docstring no final da declaração da classe; isso aliviaria a necessidade de digitar os nomes e valores dos atributos duas vezes. editar : esta última ideia, eu acho, não é realmente possível, pelo menos não sem construir dinamicamente a classe inteira a partir de dados, o que parece uma ideia realmente ruim, a menos que haja algum outro motivo para fazer isso.
Eu sou muito novo em Python e ainda estou trabalhando nos detalhes do estilo de codificação, então críticas não relacionadas também são bem-vindas.
attribute doc string
mencionado no PEP 257 que não é muito conhecido e parece difícil de encontrar, que pode responder à pergunta dos OPs e é suportado por algumas ferramentas de origem. Isso não é opinião. É um fato, parte da linguagem e praticamente exatamente o que o OP deseja.Respostas:
Para evitar confusão: o termo propriedade tem um significado específico em python. Você está falando sobre o que chamamos de atributos de classe . Uma vez que eles sempre recebem ações por meio de sua classe, acho que faz sentido documentá-los dentro da string doc da classe. Algo assim:
Acho que é muito mais fácil para os olhos do que a abordagem em seu exemplo. Se eu realmente quisesse que uma cópia dos valores dos atributos aparecesse na string doc, eu os colocaria ao lado ou abaixo da descrição de cada atributo.
Lembre-se de que, em Python, as strings de doc são membros reais dos objetos que documentam, não apenas anotações de código-fonte. Uma vez que as variáveis de atributo de classe não são objetos em si, mas referências a objetos, elas não têm como manter sequências de documentos próprias. Eu acho que você poderia fazer um caso para sequências de documentos em referências, talvez para descrever "o que deve estar aqui" em vez de "o que está realmente aqui", mas acho fácil fazer isso na sequência de documentos de classe que contém.
fonte
flight_speed = 691; flight_speed.__doc__ = "blah blah"
. Acho que é isso que você está mencionando em sua edição . Infelizmente, isso não funciona para instanciações de (a maioria?) Tipos internos (comoint
naquele exemplo). Ele funciona para instanciações de tipos definidos pelo usuário. =========== Na verdade, havia um PEP (desculpe, esqueça o número) que propôs adicionar docstrings para atributos de classe / módulo, mas foi recusado porque eles não conseguiram descobrir uma maneira de deixar isso claro se os docstrings eram para os atributos anteriores ou seguintes.Você cita o PEP257: Convenções de Docstring, na seção O que é uma docstring está declarado:
E isso é explicado com mais detalhes em PEP 258: docstrings de atributos. Conforme explicado acima ʇsәɹoɈ. um atributo não é um objeto que pode possuir um __doc__, então eles não aparecerão em
help()
ou pydoc. Essas docstrings só podem ser usadas para documentação gerada.Eles são usados no Sphinx com a diretiva autoattribute
O Sphinx pode usar comentários em uma linha antes de uma atribuição ou um comentário especial após uma atribuição ou uma docstring após a definição que será autodocumentada.
fonte
Você pode abusar das propriedades para esse efeito. As propriedades contêm um getter, um setter, um deleter e um docstring . Ingenuamente, isso ficaria muito prolixo:
Então você terá uma docstring pertencente a Cx:
Fazer isso para muitos atributos é complicado, mas você poderia imaginar uma função auxiliar myprop:
Então, chamar o Pythons interativo
help
dará:que eu acho que deve ser o que você está procurando.
Edit : Percebo agora que talvez possamos evitar a necessidade de passar o primeiro argumento para
myprop
, porque o nome interno não importa. Se as chamadas subsequentes demyprop
puderem se comunicar de alguma forma, ele poderá decidir automaticamente sobre um nome de atributo interno longo e improvável. Tenho certeza de que existem maneiras de implementar isso, mas não tenho certeza se valem a pena.fonte