Apa format dokumentasi Python standar? [Tutup]

888

Saya telah melihat beberapa gaya penulisan dokumen dengan Python, apakah ada gaya resmi atau "disetujui"?

Noah McIlraith
sumber
6
python.org/dev/peps/pep-0008 ada seluruh bagian yang dikhususkan untuk string dokumentasi
mechanical_meat
30
Saya berpikir bahwa pertanyaan ini tidak cukup jelas karena PEP-257 dan PEP-8 adalah sebagai mendirikan hanya dasar untuk docstrings, tapi bagaimana epydoc, doxygen, sphinx? Adakah yang punya statistik, apakah salah satunya akan menggantikan yang lain, dalam kasus seperti ini terlalu banyak pilihan bisa menyakitkan.
sorin
1
@sorin, saya juga ingin tahu markup apa, jika ada, yang paling umum. Tapi saya pikir jawabannya adalah tidak satu pun yang benar-benar umum: orang cenderung lebih suka melihat sumber Python secara langsung, daripada dikonversi ke html. Jadi, yang paling berguna adalah konsisten tetapi dengan cara yang dioptimalkan untuk keterbacaan manusia, dan tidak ada markup eksplisit.
poolie
3
PyCharm melakukan pelengkapan otomatis dengan cara yang agak menarik, yang menurut saya merupakan implementasi yang bagus dari instruksi yang diperlukan untuk menjalankannya:def foo(self, other):\n\t"""\n\t(blank line)\n\t:param other: \n\t:return:\n\t"""
Matteo Ferla
1
Manakah dari jawaban ini yang bekerja secara default dengan parser dokumentasi VS Code?
William Entriken

Jawaban:

1019

Format

Dokumentasi python dapat ditulis mengikuti beberapa format seperti yang ditunjukkan oleh posting lainnya. Namun format dokumentasi Sphinx default tidak disebutkan dan didasarkan pada reStructuredText (reST) . Anda dapat memperoleh beberapa informasi tentang format utama dalam posting blog ini .

Perhatikan bahwa reST direkomendasikan oleh PEP 287

Berikut ini format utama yang digunakan untuk dokumen.

- Episode

Secara historis gaya seperti javadoc adalah lazim, sehingga diambil sebagai basis untuk Epydoc (dengan Epytextformat yang disebut ) untuk menghasilkan dokumentasi.

Contoh:

"""
This is a javadoc style.

@param param1: this is a first param
@param param2: this is a second param
@return: this is a description of what is returned
@raise keyError: raises an exception
"""

- REST

Saat ini, format yang mungkin lebih umum adalah format reStructuredText (reST) yang digunakan oleh Sphinx untuk menghasilkan dokumentasi. Catatan: ini digunakan secara default di JetBrains PyCharm (ketik triple quotes setelah mendefinisikan metode dan tekan enter). Ini juga digunakan secara default sebagai format output dalam Pyment.

Contoh:

"""
This is a reST style.

:param param1: this is a first param
:param param2: this is a second param
:returns: this is a description of what is returned
:raises keyError: raises an exception
"""

- Google

Google memiliki format sendiri yang sering digunakan. Ini juga dapat diartikan oleh Sphinx (mis. Menggunakan plugin Napoleon ).

Contoh:

"""
This is an example of Google style.

Args:
    param1: This is the first param.
    param2: This is a second param.

Returns:
    This is a description of what is returned.

Raises:
    KeyError: Raises an exception.
"""

Bahkan lebih banyak contoh

- Numpydoc

Perhatikan bahwa Numpy merekomendasikan untuk mengikuti numpydoc mereka sendiri berdasarkan format Google dan dapat digunakan oleh Sphinx.

"""
My numpydoc description of a kind
of very exhautive numpydoc format docstring.

Parameters
----------
first : array_like
    the 1st param name `first`
second :
    the 2nd param
third : {'value', 'other'}, optional
    the 3rd param, by default 'value'

Returns
-------
string
    a value in a string

Raises
------
KeyError
    when a key error
OtherError
    when an other error
"""

Konversi / Pembangkitan

Dimungkinkan untuk menggunakan alat seperti Pyment untuk secara otomatis menghasilkan dokumen ke proyek Python yang belum didokumentasikan, atau untuk mengkonversi dokumen yang ada (dapat mencampurkan beberapa format) dari satu format ke format lainnya.

Catatan: Contoh-contoh diambil dari dokumentasi Pyment

daouzli
sumber
10
Saya mungkin menambahkan bahwa reST adalah apa yang digunakan secara default di JetBrains PyCharm, Cukup ketikkan tanda kutip tiga setelah mendefinisikan metode Anda dan tekan enter. jetbrains.com/pycharm/help/creating-documentation-comments.html
Felipe Almeida
12
Jawaban paling komprehensif, termasuk rasa sejarah dan praktik terbaik saat ini. Sekarang yang kita butuhkan adalah sedikit gerakan komunitas menuju format "terbaik" baru dan beberapa upaya komunitas tambahan untuk menciptakan alat migrasi dari semua yang lain ke yang baru, sehingga kita dapat benar-benar mengembangkan praktik terbaik.
BobHy
2
yo @daouzli, tautan gaya google adalah 404. Saya yakin yang ini benar. Anda dapat menambahkan contoh gaya google sphinx juga. Jawaban bagus btw. EDIT: Saya mengedit jawaban Anda sendiri.
voy
4
jawaban yang bagus. Saya berani mengatakan di mana Anda dapat mengubah format dokumen standar di PyCharm (JetBrains): Pengaturan -> Alat -> Alat Terpadu Python -> format Dokstring. Semoga berhasil!
Jackssn
4
Saya terkejut tidak ada yang berkomentar tentang baris teks pertama: saat ini benar-benar berbicara benar tetapi saya merasa seperti cara yang lebih disukai adalah menempatkannya di baris pertama setelah tiga tanda kutip. PEP 8 dan PEP 257 melakukannya di hampir semua contoh mereka. PEP 287 melakukannya dengan cara Anda, tetapi dalam pengalaman saya itu tidak umum.
Lapinot
323

The panduan gaya Google berisi panduan gaya Python baik. Ini termasuk konvensi untuk sintaks dokumentasi yang dapat dibaca yang menawarkan panduan yang lebih baik daripada PEP-257. Sebagai contoh:

def square_root(n):
    """Calculate the square root of a number.

    Args:
        n: the number to get the square root of.
    Returns:
        the square root of n.
    Raises:
        TypeError: if n is not a number.
        ValueError: if n is negative.

    """
    pass

Saya ingin memperluas ini untuk juga memasukkan informasi jenis dalam argumen, seperti yang dijelaskan dalam tutorial dokumentasi Sphinx ini . Sebagai contoh:

def add_value(self, value):
    """Add a new value.

       Args:
           value (str): the value to add.
    """
    pass
Nathan
sumber
37
Saya menemukan "tanda tangan dalam dokumen" - gaya sangat berlebihan dan bertele-tele. Untuk Python 3+, Anotasi fungsi adalah cara yang jauh lebih bersih untuk melakukan ini. Lebih buruk lagi jika menggunakan tipe pseudo-kuat: Python jauh lebih baik dengan mengetik bebek.
Evpok
27
ya, tapi setidaknya itu memberi petunjuk tentang apa jenis bebek yang diharapkan, dan mayoritas devs belum menggunakan Python 3
Anentropic
3
@Eppok pribadi, saya tidak suka penjelasan fungsi. Untuk menggunakan kelas di dalamnya Anda mungkin harus melakukan impor yang tidak perlu, untuk menggunakan string di dalamnya Anda mungkin kehabisan ruang horizontal dengan sangat cepat menggambarkannya. Sejauh ini saya belum melihat gunanya menggunakannya untuk apa pun.
OdraEncoded
5
@Nathan, panduan gaya Google merekomendasikan komentar yang deskriptif daripada deklaratif, misalnya "Ambil baris dari Bigtable" di atas "Ambil baris dari Bigtable." Dengan demikian, mengubah "Hitung ..." menjadi "Hitung ..." akan membuat contoh Anda lebih konsisten dengan komentar lainnya, yaitu "Pengembalian" dan "Peningkatan".
gwg
2
nit: Mengikuti gaya Google, gunakan bentuk deskriptif dan bukan imperatif, yaitu "Menghitung ..." dan "Menambahkan ..."
sbeliakov
228

Konvensi docstring ada dalam PEP-257 dengan lebih banyak detail daripada PEP-8.

Namun, dokumentasi tampaknya jauh lebih pribadi daripada bidang kode lainnya. Proyek yang berbeda akan memiliki standar sendiri.

Saya cenderung selalu memasukkan dokumen, karena mereka cenderung menunjukkan bagaimana menggunakan fungsi dan apa yang dilakukannya dengan sangat cepat.

Saya lebih memilih untuk menjaga hal-hal yang konsisten, terlepas dari panjang tali. Saya suka bagaimana kode terlihat ketika lekukan dan spasi konsisten. Itu artinya, saya menggunakan:

def sq(n):
    """
    Return the square of n. 
    """
    return n * n

Lebih:

def sq(n):
    """Returns the square of n."""
    return n * n

Dan cenderung tidak mengomentari baris pertama dalam dokumen yang lebih panjang:

def sq(n):
    """
    Return the square of n, accepting all numeric types:

    >>> sq(10)
    100

    >>> sq(10.434)
    108.86835599999999

    Raises a TypeError when input is invalid:

    >>> sq(4*'435')
    Traceback (most recent call last):
      ...
    TypeError: can't multiply sequence by non-int of type 'str'

    """
    return n*n

Berarti saya menemukan dokumen yang mulai seperti ini menjadi berantakan.

def sq(n):
    """Return the squared result. 
    ...
Tim McNamara
sumber
90
Perhatikan bahwa PEP-8 secara khusus mengatakan bahwa dokumen harus ditulis sebagai perintah / instruksi, bukan deskripsi, misalnya. """Return the squared result"""bukannya """Returns the squared result""". Meskipun secara pribadi, saya menulis milik saya bagaimana Tim ada di sini, terlepas dari apa yang dikatakan PEP.
Cam Jackson
63
Saya juga tidak setuju dengan saran itu (menggunakan imperative tense) karena mulai terdengar canggung untuk lebih dari satu kalimat. Selain itu, Anda menggambarkan suatu fungsi, tidak memberi tahu pembaca apa yang harus dilakukan.
mk12
14
Catatan: Spesifikasi untuk dokumen preskriptif dan bukan deskriptif sebenarnya muncul dalam PEP-257 , bukan PEP-8. Saya datang dari tradisi Jawa, di mana saya menjelaskan fungsi, tetapi saya akhirnya mulai menggunakan imperative tense ketika paradigma pemrograman saya beralih dari berorientasi objek ke prosedural. Dan ketika saya mulai menggunakan pycco untuk menghasilkan dokumentasi gaya pemrograman terpelajar, menjadi sangat jelas mengapa tensi imperatif disarankan. Anda harus memilih berdasarkan pada paradigma Anda.
karan.dodia
26
Yang penting adalah suasana gramatikal . (Maaf.)
Denis Drescher
5
@ Mk12 Pesan komit Git juga harus ditulis sebagai perintah dan bukan deskripsi. Dan mereka juga " menggambarkan " perubahan kode, "tidak memberi tahu pembaca apa yang harus dilakukan". Jadi saya pikir itu hanya kebiasaan untuk menulis deskripsi sebagai perintah.
onepiece
58

Seperti tidak ada yang menyebutkannya: Anda juga dapat menggunakan Numpy Docstring Standard . Ini banyak digunakan dalam komunitas ilmiah.

Ekstensi sphinx Napolean untuk mem-parsing Google-style docstring (direkomendasikan dalam jawaban @Nathan) juga mendukung docstring Numpy-style, dan membuat perbandingan singkat keduanya.

Dan terakhir contoh dasar untuk memberikan gambaran bagaimana tampilannya:

def func(arg1, arg2):
    """Summary line.

    Extended description of function.

    Parameters
    ----------
    arg1 : int
        Description of arg1
    arg2 : str
        Description of arg2

    Returns
    -------
    bool
        Description of return value

    See Also
    --------
    otherfunc : some related other function

    Examples
    --------
    These are written in doctest format, and should illustrate how to
    use the function.

    >>> a=[1,2,3]
    >>> print [x + 3 for x in a]
    [4, 5, 6]
    """
    return True
Joris
sumber
2
IMHO format NumPy mengambil terlalu banyak ruang vertikal yang langka pada monitor layar lebar (kecuali Anda menggunakan satu berubah oleh 90 derajat, tapi saya kira kebanyakan orang tidak) Jadi, Format Google IMHO adalah pilihan yang baik sehubungan dengan keterbacaan dan fitur.
Semanino
3
Saya kira itu agak subjektif. Setelah Anda memiliki docstring yang lebih kompleks (dengan bagian yang berbeda, dengan contoh, dll, jadi mengambil banyak ruang vertikal bagaimanapun formatnya), saya menemukan format numpydoc lebih mudah dibaca / terstruktur dengan lebih baik.
Joris
2
Secara pribadi saya merasa dokumentasi yang begitu panjang lebih baik terletak di dokumentasi, bukan kode sumber, jika begitu lama mereka akhirnya menghambat pembacaan modul.
Jonathan Hartley
12

PEP-8 adalah standar pengkodean python resmi. Ini berisi bagian tentang docstring, yang mengacu pada PEP-257 - spesifikasi lengkap untuk docstrings.

bstpierre
sumber
8
Menyebutkan PEP-257 dalam konteks "bagaimana seharusnya saya mendokumentasikan dengan benar parameter, mengembalikan nilai, pengecualian yang diangkat dll" adalah LELUCON - ia mengatakan tidak satu kata pun tentang mereka (meskipun contoh kode menunjukkan beberapa). Format Google IMHO adalah pilihan yang baik sehubungan dengan keterbacaan dan fitur.
Semanino
9

Itu adalah Python; apapun itu . Pertimbangkan cara mempublikasikan dokumentasi Anda . Dokumen tidak terlihat kecuali bagi pembaca kode sumber Anda.

Orang-orang sangat suka menelusuri dan mencari dokumentasi di web. Untuk mencapainya, gunakan alat dokumentasi Sphinx . Ini adalah standar de-facto untuk mendokumentasikan proyek Python. Produk ini indah - lihat di https://python-guide.readthedocs.org/en/latest/ . Situs web Baca Dokumen akan meng-host dokumen Anda secara gratis.

Kolonel Panic
sumber
22
Saya secara rutin menggunakan ipythonuntuk menguji-drive perpustakaan, dan itu membuat membaca dokumen mati sederhana - yang harus saya ketik adalah your_module.some_method_im_curious_about?dan saya mendapatkan setiap cetakan bagus, termasuk docstring.
Thanatos
8
Para pengguna perpustakaan atau API atau yang sedang menulis plugin semuanya cenderung melihat kode dan perlu memahaminya. Saya menemukan komentar yang jauh lebih penting dalam Python daripada di Jawa atau C # karena tipe tidak dideklarasikan. Sangat membantu jika komentar memberikan gambaran tentang jenis bebek apa yang dilewatkan dan dikembalikan. (Kalau tidak, Anda harus benar-benar berjalan semua kode dan menghitung bahwa parameter yang diberikan harus ... dapat diperbaiki di sini ... mendukung pengindeksan di sana ... mendukung pengurangan numerik pada akhirnya ... Aha! int array. Sebuah komentar akan membantu!)
Jon Coombs
Eh, tidak. Docstrings tidak terlihat dan itu sedikit intinya. Anda dapat melihat docstring jika Anda menjalankan helpfungsi pada fungsi / metode / kelas yang didokumentasikan (dan itu dapat Anda lakukan bahkan jika Anda hanya memiliki akses ke modul yang dikompilasi). Secara pribadi saya pikir kita harus mengingat hal ini ketika memilih konvensi docstring (yaitu bahwa itu bermaksud untuk dibaca apa adanya).
menjulang tinggi
7

Saya sarankan menggunakan program pep257 Python Vladimir Keleshev untuk memeriksa dokumen Anda terhadap PEP-257 dan Standar Numpy Docstring untuk menjelaskan parameter, pengembalian, dll.

pep257 akan melaporkan divergensi yang Anda buat dari standar dan disebut seperti pylint dan pep8.

Finn Årup Nielsen
sumber
Menyebutkan PEP-257 dalam konteks "bagaimana seharusnya saya mendokumentasikan dengan benar parameter, mengembalikan nilai, pengecualian yang diangkat dll" adalah LELUCON - ia mengatakan tidak satu kata pun tentang mereka (meskipun contoh kode menunjukkan beberapa). IMHO format NumPy mengambil terlalu banyak ruang vertikal yang langka pada monitor layar lebar (kecuali Anda menggunakan satu berubah oleh 90 derajat, tapi saya kira kebanyakan orang tidak) Jadi, Format Google IMHO adalah pilihan yang baik sehubungan dengan keterbacaan dan fitur.
Semanino
1
@Semanino Saya menyebutkan Numpy Docstring Standard dalam konteks program pep257, - bukan PEP-257. Program itu sekarang disebut pydocstyle. pydocstyle memungkinkan Anda melakukan beberapa pemeriksaan numpydoc, misalnya, pydocstyle --select=D4 tmp.pymemeriksa berbagai masalah konten docstring termasuk penamaan bagian.
Finn Årup Nielsen