Standart Python öğreti formatı nedir? [kapalı]


888

Python'da birkaç farklı yazım öğretisi gördüm, resmi veya “üzerinde anlaşılan” bir tarz var mı?


6
python.org/dev/peps/pep-0008 dokümantasyon dizelerine ayrılmış bir bölüm var
mechanical_meat

30
Ben PEP-257 ve PEP-8 Docstringler için sadece üs kuran çünkü bu soru yeterince açık olmadığını düşünüyorum, ama nasıl epydoc, doxygen, sphinx? Herkes herhangi bir istatistik var mı, bunlardan biri diğerlerinin yerini alacak, böyle durumlarda çok fazla seçenek zarar verebilir.
sorin

1
Ayrıca, hangi işaretlemenin (varsa) en yaygın olduğunu da bilmek isterim. Ama bence cevap hiçbiri gerçekten bu kadar yaygın değil: insanlar html'ye dönüştürülmek yerine doğrudan Python kaynağına bakmayı tercih ediyorlar. Bu nedenle, tutarlı olmak, ancak insan tarafından okunabilirlik için optimize edilmiş ve açık bir işaretleme olmayan bir şekilde en yararlıdır.
poolie

3
PyCharm oldukça ilginç bir şekilde otomatik olarak tamamlanıyor, bence bunu çalıştırmak için gereken talimatların güzel bir uygulaması:def foo(self, other):\n\t"""\n\t(blank line)\n\t:param other: \n\t:return:\n\t"""
Matteo Ferla

1
VS Code belge ayrıştırıcısıyla varsayılan olarak çalışan bu cevaplardan hangisi?
William Entriken

Yanıtlar:


1019

Biçimleri

Python docstrings diğer yazıların gösterdiği gibi birkaç formatta yazılabilir. Ancak, varsayılan Sphinx docstring biçiminden bahsedilmedi ve reStructuredText (reST) yöntemini temel alıyor . Bu blog gönderisindeki ana biçimler hakkında bilgi edinebilirsiniz .

REST'nin PEP 287 tarafından önerildiğini unutmayın

Docstringler için kullanılan ana formatlar aşağıdadır.

- Ek metin

Tarihsel olarak javadoc benzeri bir stil yaygındı, bu nedenle Epydoc'ın (çağrılan Epytextformatla) dokümantasyon oluşturması için bir temel olarak alındı .

Misal:

"""
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
"""

- dinlenme

Günümüzde, muhtemelen daha yaygın olan biçim, Sphinx tarafından belge oluşturmak için kullanılan reStructuredText (reST) biçimidir . Not: JetBrains PyCharm'da varsayılan olarak kullanılır (bir yöntemi tanımladıktan sonra üçlü tırnaklar yazın ve enter tuşuna basın). Ayrıca, Pyment'ta varsayılan olarak çıktı biçimi olarak da kullanılır.

Misal:

"""
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'ın sıklıkla kullanılan kendi biçimi vardır. Ayrıca Sfenks tarafından yorumlanabilir (yani Napolyon eklentisi kullanılarak ).

Misal:

"""
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.
"""

Daha da fazla örnek

- Numpydoc

Numpy'nin Google formatına dayalı ve Sphinx tarafından kullanılabilen kendi numpydoc'larını takip etmeyi önerdiğini unutmayın .

"""
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
"""

Dönüştürme / Üretme

Henüz belgelenmemiş bir Python projesine otomatik olarak docstring oluşturmak veya mevcut docstring'leri (birkaç formatı karıştırabilir) bir formattan diğerine dönüştürmek için Pyment gibi bir araç kullanmak mümkündür .

Not: Örnekler Pyment belgelerinden alınmıştır.


10
Ben reST JetBrains PyCharm varsayılan olarak kullanılan şey olduğunu ekleyebilirsiniz, Sadece yönteminizi tanımladıktan sonra üçlü tırnak yazın ve enter tuşuna basın. jetbrains.com/pycharm/help/creating-documentation-comments.html
Felipe Almeida

12
En kapsamlı cevap, bir tarih duygusu ve mevcut en iyi uygulamaları içerir. Şimdi ihtiyacımız olan tek şey, yeni bir "en iyi" formata yönelik bir topluluk hareketi duygusu ve diğerlerinden yenisine geçiş araçları oluşturmak için bazı ek topluluk çabalarıdır, böylece en iyi uygulamayı geliştirebiliriz.
BobHy

2
yo @daouzli, stil linki google ı inanıyoruz 404. olan bu doğrudur. Sfenks google tarzı örneği de ekleyebilirsiniz . Harika cevap btw. EDIT: Cevabınızı kendim düzenledim.
voy

4
iyi cevap. PyCharm'da (JetBrains) varsayılan docstring biçimini değiştirebileceğinizi söyleyebilirim: Ayarlar -> Araçlar -> Python Tümleşik Araçları -> Docstring biçimi. İyi şanslar!
Jackssn

4
Kimse ilk metin satırı hakkında yorum yaptı şaşırdım: şu anda kesinlikle doğru konuşuyor ama tercih edilen yol sadece üç tırnak sonra ilk satıra yerleştirmek gibi hissediyorum. PEP 8 ve PEP 257 bunu neredeyse tüm örneklerinde yapmaktadır. PEP 287 bunu kendi tarzınızda yapar, ancak benim deneyimime göre bu çok yaygın değildir.
Lapinot

323

Google stil kılavuzu mükemmel bir Python stil kılavuzu içerir. PEP-257'den daha iyi rehberlik sunan okunabilir doktora sözdizimi kurallarını içerir . Örneğin:

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

Ben de bu Sfenks dokümantasyon öğretici açıklandığı gibi, argümanlarda tür bilgilerini eklemek için genişletmek istiyorum . Örneğin:

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

       Args:
           value (str): the value to add.
    """
    pass

37
Ben "docstrings imza" tarzı bulmak çok gereksiz ve ayrıntılı. Python 3+ için İşlev ek açıklamaları bunu yapmanın çok daha temiz bir yoludur. Sahte güçlü tipler kullanıyorsa daha da kötüsü: Python ördek yazarken çok daha iyidir.
Evpok

27
evet, ama en azından ne tür bir ördek beklendiğine dair bir ipucu veriyor ve geliştiricilerin çoğunluğu henüz Python 3'te değil
Anentropic

3
@ Kişisel olarak kişisel olarak, ek açıklamaları sevmiyorum. İçlerinde sınıfları kullanmak için gereksiz ithalatlar yapmanız, içlerinde dizeleri kullanmak için onları çok hızlı bir şekilde tanımlayan yatay alanınız bitebilir. Şimdiye kadar onları hiçbir şey için kullanma noktasını görmedim.
OdraEncoded

5
@Nathan, Google'ın stil kılavuzu, açıklamadan ziyade açıklayıcı yorumlar önerir, örneğin "Bir Bigtable'tan satır getir", "Bigtable'dan satır getir". Bu nedenle, "Hesapla ..." ifadesini "Hesaplar ..." olarak değiştirmek, örneğin yorumun geri kalanıyla, yani "İade" ve "Yükseltir" ifadesiyle daha tutarlı olmasını sağlar.
gwg

2
nit: Google stilini takiben, zorunlu formdan ziyade açıklayıcı bir form kullanın, yani "Hesaplar ..." ve "Ekler ..."
sbeliakov

228

Dokümantasyon kuralları PEP- 257'de PEP-8'den çok daha ayrıntılıdır.

Ancak, öğretiler diğer kod alanlarından çok daha kişisel görünmektedir. Farklı projelerin kendi standartları olacaktır.

Her zaman öğretileri dahil etme eğilimindeyim, çünkü işlevi nasıl kullanacağını ve çok hızlı bir şekilde ne yaptığını gösterme eğilimindedirler.

Dizenin uzunluğundan bağımsız olarak işleri tutarlı tutmayı tercih ederim. Girinti ve boşluk tutarlı olduğunda nasıl kodlamak gibi. Bu şu anlama gelir:

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

Bitmiş:

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

Ve daha uzun docstrings ilk satırda yorum bırakma eğilimindedir:

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

Yani böyle başlayan dağınık öğretileri buluyorum.

def sq(n):
    """Return the squared result. 
    ...

90
PEP-8'in özellikle docstring'lerin açıklamalardan ziyade komut / talimat olarak yazılması gerektiğini söylediğini, örn. """Return the squared result"""yerine """Returns the squared result""". Şahsen, PEP'in söylediklerine rağmen Tim'in burada nasıl olduğunu bana yazıyorum.
Cam Jackson

63
Ayrıca bu tavsiyeye katılmıyorum (zorunlu zamanı kullanarak), çünkü bir cümleden daha uzun bir şey için garip geliyor. Ayrıca, okuyucuya ne yapması gerektiğini söylemeyen bir işlevi açıklıyorsunuz .
mk12

14
Not: Açıklayıcı doktrinler yerine kuralcı belirtimler aslında PEP-8'de değil, PEP- 257'de görünür . İşlevleri tanımladığım bir Java geleneğinden geldim, ama sonunda programlama paradigmam nesne yönelimli ve yordamsal hale geldiğinde zorunlu zamanı kullanmaya başladım. Ve pycco kullanmaya başladığımda okuryazar programlama tarzı belgeler oluşturmak , zorunlu zamanın neden önerildiği çok açık hale geldi. Paradigmanıza göre seçim yapmalısınız.
karan.dodia

25
Zorunlu dilbilgisel bir ruh hali . (Üzgünüm.)
Denis Drescher

5
@ Mk12 Git kesinleştirme mesajları, açıklamalar yerine komutlar olarak da yazılmalıdır. Ayrıca okuyucuya ne yapması gerektiğini söylemeyen bir kod değişikliğini " tarif ediyorlar ". Bu yüzden açıklamaları komut olarak yazmanın sadece bir kural olduğunu düşünüyorum.
onepiece

58

Görünüşe göre hiç kimse bundan bahsetmediği gibi: Numpy Docstring Standardını da kullanabilirsiniz . Bilimsel toplulukta yaygın olarak kullanılmaktadır.

Google tarzı doktrinleri ayrıştırmak için Napolean sfenks uzantısı (@Nathan cevabında önerilir) Numpy tarzı doktrinleri de destekler ve her ikisinin de kısa bir karşılaştırmasını yapar .

Ve nasıl göründüğüne dair bir fikir vermek için temel bir örnek verin:

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

2
NumPy formatı IMHO, geniş ekran monitörlerde çok az dikey alan kaplar (90 derece döndürülmüş bir tane kullanmanız hariç, ancak çoğu insanın kullanmadığı tahmin edilir) Bu nedenle, IMHO Google Format, okunabilirlik ve özellikler açısından iyi bir seçimdir.
Semanino

3
Sanırım biraz öznel. Bir kez daha karmaşık bir doktora (örneklerle vb. İle, bu yüzden biçim ne olursa olsun çok fazla dikey alan alarak) var, ben numpydoc formatı daha kolay okunabilir / yapılandırılmış bulabilirsiniz.
joris

2
Şahsen ben böyle uzun bir öğretinin kaynak kodunda değil, dokümantasyonda daha iyi olduğunu hissediyorum, eğer çok uzunsa modülün okunabilirliğini engelliyorlar.
Jonathan Hartley

12

PEP-8 resmi python kodlama standardıdır. Docstringlerle ilgili, PEP- 257'ye atıfta bulunan - docstrings için tam bir spesifikasyon olan bir bölüm içerir .


8
PEP-257 "parametreleri, dönüş değerlerini, istisnaları vb. Doğru şekilde nasıl belgelemeliyim" bağlamında bahsetmek bir JOKE'dir - onlar hakkında tek bir kelime söylemez (bir kod örneği bazılarını göstermesine rağmen). IMHO Google Format, okunabilirlik ve özellikler açısından iyi bir seçimdir.
Semanino

9

Bu Python; bir şey gider . Belgelerinizi nasıl yayınlayacağınızı düşünün . Docstringler kaynak kodunuzun okuyucuları dışında görünmez.

İnsanlar web'deki belgelere göz atmayı ve arama yapmayı gerçekten seviyor. Bunu başarmak için Sfenks dokümantasyon aracını kullanın . Python projelerini belgelemek için fiili standarttır. Ürün güzel - https://python-guide.readthedocs.org/en/latest/ adresine bakın . Dokümanları Oku web sitesi dokümanlarınızı ücretsiz olarak barındırır.


22
ipythonBir kütüphaneyi test sürüşü için düzenli olarak kullanıyorum ve bu, docstring'leri okumayı basitleştiriyor - yazmam gereken tek şey your_module.some_method_im_curious_about?ve docstring de dahil olmak üzere her güzel çıktıyı alıyorum.
Thanatos

8
Bir kitaplığın veya bir API'nın veya bir eklenti yazan kullanıcıların, koda bakması ve bunun bir anlam ifade etmesi gerekir. Python'da yorumları Java veya C # 'dan çok daha önemli buluyorum çünkü türler bildirilmedi. Yorumlar kabaca ne tür ördeklerin geçtiği ve iade edildiği hakkında bir fikir verirse çok yardımcı olur. (Aksi takdirde, aslında tüm kodu yürümek ve verilen bir parametrenin ... burada tekrarlanabilir olması gerekir ... orada indekslemeyi destekleyin ... sonunda sayısal çıkarma desteği ... Aha! int dizi. Bir yorum yardımcı olurdu!)
Jon Coombs

Eh, hayır. Docstrings görünmez değildir ve bu biraz önemlidir . helpİşlevi belgelenmiş işlev / yöntem / sınıfta çalıştırırsanız (ve yalnızca derlenmiş modüle erişiminiz olsa bile yapabilirsiniz) doktrini göreceksiniz . Şahsen, doktorluk sözleşmesini seçerken bunu akılda tutması gerektiğini düşünüyorum (yani olduğu gibi okunması amaçlanmıştır).
1919'da

7

Parametrelerinizi, iadelerinizi vb. Tanımlamak için doktorlarınızı PEP-257 ve Numpy Docstring Standard'a karşı kontrol etmek için Vladimir Keleshev'in pep257 Python programını kullanmanızı öneririm .

pep257, standarttan yaptığınız sapmayı bildirir ve pylint ve pep8 gibi adlandırılır.


"Parametreleri, dönüş değerlerini, istisnaları vb. Doğru şekilde nasıl belgelemeliyim" bağlamında PEP-257'den bahsetmek bir JOKE'dir - onlar hakkında tek bir kelime söylemez (bir kod örneği bazılarını göstermesine rağmen). NumPy formatı IMHO, geniş ekran monitörlerde çok az dikey alan kaplar (90 derece döndürülmüş bir tane kullanmanız hariç, ancak çoğu insanın kullanmadığı tahmin edilir) Bu nedenle, IMHO Google Format, okunabilirlik ve özellikler açısından iyi bir seçimdir.
Semanino

1
@Semanino Pep257 programı bağlamında Numpy Docstring Standardından bahsediyorum - PEP-257'den değil. Bu program şimdi pydocstyle olarak adlandırılıyor. pydocstyle bazı numpydoc kontrolleri yapmanıza izin verir, örn pydocstyle --select=D4 tmp.py. bölüm adlandırma dahil bir dizi docstring içerik sorununu kontrol eder.
Finn Årup Nielsen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.