Değişken ve işlev adları için Python'da adlandırma kuralı nedir?


772

Bir C # arka planından gelen değişkenler ve yöntem adları için adlandırma kuralı genellikle camelCase veya PascalCase'dir:

// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

Python'da, yukarıdakileri gördüm ama alt çizgilerin kullanıldığını da gördüm:

# python example
this_is_my_variable = 'a'
def this_is_my_function():

Python için daha çok tercih edilen, kesin bir kodlama stili var mı?

Yanıtlar:


867

Bkz. Python PEP 8: İşlev ve Değişken İsimleri :

İşlev adları okunabilirliği artırmak için kelimeler alt çizgilerle ayrılmış küçük harflerle yazılmalıdır .

Değişken adları işlev adlarıyla aynı kuralı izler.

mixedCase , geriye dönük uyumluluğu korumak için yalnızca geçerli stil olan bağlamlarda (örneğin, threading.py ) izin verilir .


127
PEP = Python Geliştirme Önerisi.
Peter Mortensen

8
@RickyRobinson Hangi beyin ölü kod düzenleyicisini kullanıyorsunuz, bu alt çizginin bir kelimeye devam ettiğini bilmiyor mu? Birçok ücretsiz olanlar. Bir IDE yoksa Notepad ++ kullanıyorum. Bunun için, python düzenleme için bir şablon indirebilirsiniz. (Diğerleri daha da ücretsiz ücretsiz indirmeler önerebilir.)
ToolmakerSteve

57
Alt çizgi stili için bir örnek, tek harfli kelimeleri daha iyi kullanabilmenizdir. (Oldukça aptalca) bir örnek için, findMeAClassbelki de daha çirkin find_me_a_class.
heltonbiker

9
Küçük harfli değişken isimlerinin konvansiyonunun, büyük harflerle gösterilen tanınmış sabitler, tansörler vb.
andreasdr

12
@rr PEP8 bir "Stil Kılavuzu" dur ve kendisini bir Standart DEĞİL bir Sözleşme olarak tanımlar. Aynı zamanda bu "kurallara" her zaman uymamanın nedenlerini açık bir şekilde açıklar.
Tahaan

710

Google Python Stil Kılavuzu Şu düzeni vardır:

module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name.

Benzer bir adlandırma şeması bir CLASS_CONSTANT_NAME


37
a) Örnekleri seviyorum - teşekkürler. b) CamelCase ve alt çizgilerin itici olmayan karışımı mı? Ancak: Python ve daha esnek veri modelinde yeni olduğum için, Google'ın kılavuzunun arkasında sağlam bir düşünce olduğunu iddia ediyorum ...
Matthew Cornell

19
@MatthewCornell karıştırdığınız sürece karıştırmak kötü değildir. Fonksiyonların alt çizgileri olduğunu ve sınıfların olmadığını biliyorsanız, okunabilirliği kolaylaştırır.
Pithikos

1
@MatthewCornell Python ile ilgisi olduğunu düşünmezdim. Go aslında keyfi güzellik standartlarını uygular ve örneğin kıvırcık süslü ayraç kurallarına uymazsanız derlenemez. Aslında, birisinin gerçekten dikkatli bir düşünceye sahip olup olmadığı veya bir şeyleri yapma şeklini gerçekten sevip sevmediği konusunda bir zar attı.
Parthian Shot

Bir GLOBAL_CONSTANT_NAME sabit statik özelliğini düşünür müsünüz? Sınıfın kapsamı kadar küresel değil.
James T.

sonra içeri girer property... belki de öğenin gerçekte olduğu gibi
görünmemesi meselesidir

240

( "Kod gibi Pythonista" David Goodger burada şöyle) Pep 8 öneriler açıklar:

  • joined_lower fonksiyonlar, yöntemler, nitelikler, değişkenler için

  • joined_lowerveya ALL_CAPSsabitler için

  • StudlyCaps sınıflar için

  • camelCase sadece önceden var olan sözleşmelere uymak için


3
+1 görsel örnekler. PEP8'in sabitlerjoined_lower için nereyi önerdiğini göremesem de , sadece "sözcükleri ayıran altçizgi olan tüm büyük harfler". Yeni numaralandırma özelliği hakkında da meraklı .
Bob Stein

1
StudlyCaps for classesneredeyse tüm dillerdeki sınıflar için büyük bir evrensel kuraldır. Öyleyse neden bazı python yerleşik sınıfları var ( datetime.datetimebu sözleşmeyi takip etmiyor gibi ?)
Prahlad Yeri

3
@PrahladYeri: Maalesef unittest.TestCase.assertEqualarkadaşlar da snake_case kuralına uymuyor. Gerçek şu ki, Python standart kütüphanesinin bazı kısımları sözleşmeler sağlamlaştırılmadan önce geliştirildi ve şimdi onlarla sıkıştık.
wchargin

3
CamelCase kafa karıştırıcı çünkü bazı insanlar "camelCase" ("mixedCase" olarak da bilinir) ve bazı insanlar "CamelCase" ("StudlyCaps" olarak da bilinir) diyor. Örneğin, "camelCase" den bahsederken PEP "CamelCase" den bahseder.
Pro Q

buradaki bağlantınız öldü, belki yerine david.goodger.org/projects/pycon/2007/idiomatic
Wolf,

42

As Python Kodu için Stil Kılavuzu , itiraf

Python kütüphanesinin adlandırma kuralları biraz karışıktır, bu yüzden bunu asla tamamen tutarlı hale getirmeyeceğiz

Bunun sadece Python'un standart kütüphanesine atıfta bulunduğunu unutmayın . Eğer bunu tutarlı kılamazlarsa, tüm Python kodları için genel olarak uyulması gereken bir konvansiyona sahip olma umudu pek yoktur, değil mi?

Bu itibaren ve burada tartışma, bunun olduğunu anlamak istiyorum değil birini kullanarak devam ederse korkunç günah Örneğin Java en veya C # 'ın (açık ve köklü) Python yanına geçerken değişkenler ve fonksiyonlar için adlandırma kuralları. Elbette, bir kod tabanı / proje / ekip için hakim olan stilin ne olduğuna uymanın en iyisi olduğunu unutmayın. Python Stil Kılavuzu'nun işaret ettiği gibi, iç tutarlılık en önemli şeydir.

Beni bir sapkın olarak reddetmekten çekinmeyin. :-) OP gibi ben zaten bir "Pythonista" değilim.


32

Diğer cevapların gösterdiği gibi PEP 8 var , ancak PEP 8 sadece standart kütüphane için stil kılavuzu ve sadece orada müjde olarak alındı. PEP 8'in diğer kod parçaları için en sık sapmalarından biri, özellikle yöntemler için değişken adlandırmadır. Tek bir baskın stil yoktur, ancak mixedCase kullanan kodun hacmi göz önünde bulundurulursa, biri sıkı bir sayım yapacak olsaydı, muhtemelen mixedCase ile PEP 8'in bir sürümü ile sonuçlanacaktır. PEP 8'den oldukça yaygın olan başka bir sapma var.


9
Bu, 'cevap verildiğinde' 08'de doğru olabilir, ancak günümüzde neredeyse tüm büyük kütüphaneler PEP 8 adlandırma kurallarını kullanmaktadır.
Thane Brimhall

28

Belirtildiği gibi, PEP 8 lower_case_with_underscoresdeğişkenler, yöntemler ve fonksiyonlar için kullanıldığını söyler .

Ben lower_case_with_underscoresdeğişkenleri ve mixedCaseyöntem ve fonksiyonlar için kullanmayı tercih kodu daha açık ve okunabilir hale getirir. Böylece Python'un Zen'ini takip etmek “açık, örtük olmaktan iyidir” ve “Okunabilirlik önemlidir”


3
+1 Bu ikisini değiştiriyorum (değişkenler için mixedCase kullanıyorum), ancak bunun gibi daha her şeye sahip olmak, özellikle işlevler arasında dolaşabildiğiniz için, neyle uğraştığınızı hemen ortaya çıkarmaya yardımcı olur.
Xiong Chiamiov

2
"Okunabilirlik" oldukça öznel olsa da. Alt çizgi okunabilir yöntemler buluyorum.
Pithikos

Sizin tercihiniz, yıllarca süren Java geliştirmesinden gelen ilk sezgimdi. Değişkenler için _ kullanmayı seviyorum ama gözler, işlevler ve yöntemler için bana biraz komik görünüyor.
Michael Szczepaniak

21

@JohnTESlade'in yanıtladığı konuya ek olarak. Google'ın python stil kılavuzu oldukça düzgün öneriler var,

Kaçınılması Gereken İsimler

  • sayaçlar veya yineleyiciler hariç tek karakter adları
  • herhangi bir paket / modül adında tire (-)
  • \__double_leading_and_trailing_underscore__ names (Python tarafından ayrılmıştır)

Adlandırma kuralı

  • "Dahili", bir modülün içindeki veya bir sınıf içindeki korumalı veya özel anlamına gelir.
  • Tek bir alt çizgi (_) eklemek, modül değişkenlerini ve işlevlerini korumak için bazı desteklere sahiptir (içe aktarma * ile dahil değildir). Bir örnek değişkenine veya yönteme bir çift alt çizgi (__) eklemek, değişkeni veya yöntemi kendi sınıfına özel hale getirmeye yarar (ad yönetimi kullanarak).
  • İlgili sınıfları ve üst düzey işlevleri bir modüle yerleştirin. Java'nın aksine, modül başına kendinizi bir sınıfla sınırlandırmanıza gerek yoktur.
  • CapWordsSınıf adları için, ancak lower_with_under.pymodül adları için kullanın . Mevcut birçok modül olmasına rağmen CapWords.py, bu artık cesaret kırılmıştır çünkü modül bir dersten sonra adlandırıldığında kafa karıştırıcıdır. ("bekle - yazdım mı import StringIOyoksa from StringIO import StringIO?")

Guido'nun Tavsiyelerinden türetilen kılavuzlar resim açıklamasını buraya girin


17

Çoğu python insanı alt çizgileri tercih eder, ancak şu anda 5 yıldan beri python kullanıyorum, yine de onları sevmiyorum. Bana sadece çirkin gözüküyorlar, ama belki de kafamdaki tüm Java.

CamelCase'i daha iyi seviyorum çünkü sınıfların isimlendirilmesiyle daha iyi uyuyor, Sahip SomeClass.doSomething()olmaktan daha mantıklı geliyor SomeClass.do_something(). Python'daki küresel modül dizinine bakarsanız, her ikisini de bulacaksınız; . Sonuç olarak şöyle diyorum: İstediğinizi daha iyi kullanın, bu sadece kişisel zevk meselesidir.


10
Bir Java geçmişinden geliyorum ve sadece ikincisi görüşle, ayrıntılı ve çirkin, alt çizgileri buluyorum. Adlandırma bazı açılardan okunabilirlik ve kısalık arasında bir denge oluşturmaktadır. Unix çok ileri gider, ancak en.wikipedia.org/wiki/Domain-specific_language sınırlıdır. CamelCase kapaklar nedeniyle okunabilir, ancak ekstra karakter içermez. 2c
Matthew Cornell

2
Benim için alt çizgiler, işlevlerde / yöntemlerde çekici çünkü her alt çizgiyi sanal (kafamda) bir ad alanı için ayırıcı olarak görüyorum. Bu şekilde kolayca benim yeni işlevleri / yöntemleri isim nasıl bilebilir: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos

3
Genellikle (genellikle) çağrı yapmazsınız SomeClass.doSomething()(statik yöntemler genellikle nadirdir)an_instance.do_something()
Dave

15

Şahsen CamelCase'i sınıflar, mixedCase yöntemleri ve işlevleri için kullanmaya çalışıyorum. Değişkenler genellikle alt çizgi ile ayrılır (hatırlayabildiğimde). Bu şekilde, her şeye aynı görünmek yerine tam olarak ne dediğimi bir bakışta anlatabilirim.


15
Deve kutusu, "camelCase" gibi küçük bir IIRC harfiyle başlar.
UnkwnTech

11
Bence crystalattice doğru vardı - en azından, kullanımı PEP8 (CamelCase ve mixedCase) kullanımı ile tutarlıdır.
Jarrett

1
@UnkwnTech FirstLetterUpper terimi bazen PascalCase olarak adlandırılır
SurpriseDog

CamelCase mi yoksa camelCase mi? justWondering.
Pokitrel

11

Bununla ilgili bir makale var: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Snake_case'in camelCase'den daha okunabilir olduğunu söylüyor. Bu yüzden modern diller her yerde yılan kullanır (veya kullanmalıdır).


9
İlginç bir şekilde, "Bu çalışmanın sonuçları mutlaka kaynak koduna gömülü tanımlayıcılar için geçerli olmayabilir. Deve tanıtıcılarının programlama yapılarına gömüldüğünde daha iyi bir gestalt öğesi olarak hareket etmesi tamamen mümkündür."
rob3c

2

Kodlama stili genellikle bir kuruluşun iç politika / konvansiyon standartlarının bir parçasıdır, ancak genel olarak all_lower_case_underscore_separator stili (yılan_case olarak da bilinir) python'da en yaygın olanıdır.


0

Ben tutarlı ve takip edilmesi kolay olduğu için diğer programlama dillerinde geliştirirken Java'nın adlandırma kurallarını şahsen kullanıyorum. Bu şekilde, projemin en zor kısmı olmaması gereken hangi sözleşmeleri kullanacağım konusunda sürekli mücadele etmiyorum!


Bir şekilde katılıyorum. X dili projenin yalnızca küçük bir miktarıysa, metnin nasıl biçimlendirileceğinin bağlamsal geçişi bir yük olabilir. Ana hıçkırık kütüphanelerin çağrıları tek bir stilde yapmasıdır ( library_function(my_arg)).
Lan

-2

Tipik olarak, dilin standart kütüphanesinde kullanılan kurallara uyulur.

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.