Sabitlerim için gerçekten tüm büyük harfleri kullanmalı mıyım?


34

Öncelikle kaynak kodunu düzenlemek için pylint kullanan bir Python programcısıyım. Biri hariç tüm uyarıları kaldırabilirim: Bir sabit için geçersiz ad. Adı tüm büyük harflerle değiştirmek onu düzeltir, ama gerçekten yapmam gerekir mi? Bunu yaparsam, değişkenlerin çoğu sabit olduğu için kodumun çirkin göründüğünü anlıyorum (pylint'e göre).


1
Değişkenlerinizin çoğu modül düzeyinde sabitlerse, muhtemelen olağandışı bir şey yapıyorsunuzdur. Çoğu, fonksiyonların içinde yaşamalıdır.
RemcoGerlich

1
Bize pylint'in sabit olduğunu düşündüğü bir kod örneği gösterebilir misiniz?
Winston Ewert

@WinstonEwertNOTES_DIRECTORY = argv[1] chdir(NOTES_DIRECTORY) FILES = glob('*.txt') RAND_FILE = choice(FILES) with open(RAND_FILE) as notes_file: POINTS = notes_file.readlines() RAND_POINT = choice(POINTS)
Abhishek Kumar,

@AbhishekKumar, kodunuz bir fonksiyonda mı, yoksa en üst seviyede mi?
Winston Ewert,

@WinstonEwert En üst düzeyde ve PyLint'in talimatlarını takip ettikten sonra.
Abhishek Kumar

Yanıtlar:


33

Muhtemelen bu şekilde kod yazıyorsunuz:

notes_director = argv[1]
chdir(notes_director)
files = glob('*.txt')
rand_file = choice(files)
with open(rand_file) as notes_file: 
    points = notes_file.readlines() 
    rand_point = choice(points)

Bu kodu bir işleve taşımalısınız:

def main():
    notes_director = argv[1]
    chdir(notes_director)
    files = glob('*.txt')
    rand_file = choice(files)
    with open(rand_file) as notes_file: 
        points = notes_file.readlines() 
        rand_point = choice(points)

# actually call the main function    
main()

Pylint, işi gerçekten yapan kodun bir işlev içinde olacağını varsayar. Çünkü bu kodu, kodun en üstünde, bir fonksiyonun içinde tutmak yerine karıştırır.

Genel olarak konuşursak, üst düzey yerine bir işlev içinde iş yapmak daha iyidir. Bu, yaptığınız işi daha iyi organize etmenizi sağlar ve yeniden kullanmanıza yardımcı olur. Gerçekten sadece hızlı ve kirli bir komut dosyasında bir fonksiyonun dışında bir algoritma yapan kodunuz olmalıdır.


1
Kesinlikle katılmıyorum, modül düzeyinde değişkenleri kullanmak için birçok iyi Pythonic neden olduğunu düşünüyorum. Bu tavsiyenin yalnızca PEP8'i yanlış okuyan bir pilin artefaktı olduğunu düşünüyorum ve "sabitlerin modül seviyesinde olmalı" ifadesinin de doğru olması gerektiğini düşünüyorum.
MetricSystem

21

Evet. PEP8’lerin sabitleri kuralına göre :

Sabitler genellikle modül düzeyinde tanımlanır ve tüm büyük harflerle kelimeleri birbirinden ayıran alt çizgi ile yazılır. Örnekler arasında MAX_OVERFLOWve TOTAL.

Uzun versiyon:

Python topluluğunda (diğer topluluklarda olduğu gibi) kod yazmanın sözleşmeleri vardır. Bu, çalışma kodundan farklıdır : sabitlerinizi tüm küçük harflerle yazsanız bile, kodunuz hala çalışır.

Ancak, pylint gibi araçlarla "zorlanan" topluluk fikir birliği (PEP8'de belirtildiği gibi) vardır . Kendi mutluluğunuz için program yaparsanız, pylint'in size verdiği ipuçlarını ihmal edebilirsiniz. Eğer toplulukla açık değiş tokuş yapmak istiyorsanız, aka »kendimden başka biri kodumu kullanmalı«, kodunuzu PEP8'e göre hazırlamanız gerekir.


7
Öte yandan, pylintyanlış anlamak tamamen mümkündür . Python, bir sabiti değişkenden ayırmanın bir yolunu sunmaz, bunun dışında sabitin her zaman aynı değerde olması beklenir. pylintsadece bir kez ayarlanan ve hiç değişmeyen bir şeyin sabit olduğunu varsayar, ancak sabit olması amaçlanmadıkça , uygulamanın bir ürünü olabilir. Özellikle soruya verilen yorumda verilen kod, her çalıştırmada farklı olacak değerlere sahiptir, bu nedenle pylint onların öyle olduğunu düşünüyor olsa bile sabit olarak kabul edilmemelidir.
Jules

@Jules Ben bir kez ayarlanmış değişkenleri çağırmak ve çalışma zamanı sırasında bir daha asla sabit bir değişmez, bu nedenle birçok dilde (örneğin JS) bir constanahtar kelime var. Her ne kadar ilk değer belki dışında, farklı olsa da PI.
Thomas Junk

1
Bir ayırt ediyorum değişmez değişken (yani çalışma zamanında ayarlanır ve değişti şey) ve bir sabiti her program vadede aynıdır ve dil bunu yapmak için bir seçenek sağlarsa derleme sırasında bilgisayarlı olabilir (yani bir şey ) ... mesele şu ki, çünkü python ayrımı belirtmenin herhangi bir yolunun bulunmaması pylint, eski durumdayken bile ikincisini varsayıyor.
Jules

Pylint kesinlikle yanlıştır, çünkü “sabitler modül seviyesinde olmalı” ve sohbeti “modül seviyesi sabit olmalıdır” şeklinde kabul etti. Ama aksi takdirde iyi, kullanışlı bir araç olduğu için takılıyoruz gibi görünüyor.
MetricSystem

@MetricSystem ne - sizce - fonksiyonu bir modül seviye değişkeni sabit olmaktan başka ne olurdu? Değişebilir mi olmalı?
Thomas Junk

13

PEP8 ve Python topluluk normu kullanmaktır ALL_CAPS_CONSTANTS. On yıllardır C, Java, Perl, PHP, Python, bash ve diğer programlama dilleri ve kabuk ortamlarında kullanılan yaygın bir görsel ipucudur. Ancak modern çevrimiçi bakışta, TÜM CAPS SHOUTING GÖSTERMELERİ . Ve bağırmak kaba.

Python, bununla ilgili olarak tutarsız ALL_CAPS_CONSTANTS. JavaScript olabilir Math.PI, ancak Python'da vardır math.pi. Than'dan daha fazla tanınabilir veya kalıcı bir sabit yoktur. Ya da sys.version_infoüzerinde çalıştığınız Python sürümünü düşünün . Programınızın ömrü boyunca% 100 sabit - çok daha fazla PORTveyaMAX_ITERATIONS tanımladığınız diğer sabitlerden . Ya da sys.maxsize? Platformunuzun maksimum yerel tamsayı değeri, yalnızca bir veya iki programın çalışması değil, donanımınızın ömrü boyunca sabittir.

Eğer bu sabitler - bazı fundamental ve e gibi, evrenin temel sabitleridir ve sonsuza dek değişmeyecekse - onlar alt durum, şey ... bu yüzden can diğer sabitleri olabilir. Seçebilirsiniz.

Unutmayın, PEP8 bir stil rehberidir. Bir rehber, bir yasa değil. Python'un standart kütüphanesi tarafından bile sıklıkla bir kılavuz Ve başka bir çekirdek Python kılavuzuna atıfta bulunarak, PEP20 (aka "Python Zen"):

  • Güzel çirkin daha iyidir
  • Okunabilirlik sayar
  • Pratiklik saflığı yener.

Bir program en ufak bir not, Açık YELLY_CONSTANTve SHOUTY_PARAMETERbaşlar rendeleyin, bütün-kapaklar sabitleri genellikle gerçekten kalıcı olmadığını hatırlamak yardımcı Platonik ideallerini , ancak programı çalıştırıp parametreleri. Hakkında gerçekten sabit bir şey yoktur PORT, SITENAMEya NUMRUNSve bunlar başına bir program globalsin olarak yönetilmelidir gerekmez. Örneğin, küresel olarak erişilebilen bir program parametreleri paketi olarak bir sözlüğe bırakılabilirler:

config = {
    'port': 80,
    'sitename': "Bubba's Blog",
    'numruns': 100,
}

Python ayrıca, kullanım ihtiyacını azaltan iyi bir anahtar kelime parametresi geçirme özelliğine sahiptir APPARENTLY_ANGRY_GLOBAL_VARIABLES:

def process_data(sitename, port=80, numruns=100):
    ...

process_data("Bubba's Blog")

Uygulamada, bu değerlerin birçoğu kontrol ilkesinin / modelinin tersine çevrilmesi için config dosyalarından, işletim sistemi ortam değişkenlerinden, komut satırı argümanlarından veya diğer kaynaklardan okunacaktır (ya da olmalıdır) . Ama bu başka bir gün için daha büyük bir hikaye.


1

Evet, çoğu programlama dilinde oldukça yaygındır (en azından kullandıklarım).

Aynı ekibin geliştiricileri arasında ortak bir stil paylaşmak için bu Google bağlantısına başvurabilirsiniz .

Kullanılması tavsiye edilir

Type                  |Public          |Internal
Global/Class Constants|CAPS_WITH_UNDER |_CAPS_WITH_UNDER
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.