Pilint neden tek karakterli değişken isimlerine itiraz ediyor?


100

Hala python kurallarına alışmaya ve pylintkodumu daha pitonik yapmak için kullanmaya alışıyorum, ancak pilin tek karakterli değişken adlarını sevmemesi beni şaşırttı. Bunun gibi birkaç döngüm var:

for x in x_values:
   my_list.append(x)

ve çalıştırdığımda pylint, şunu alıyorum Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- bu geçerli bir değişken adının 3 ila 31 karakter uzunluğunda olması gerektiğini gösteriyor, ancak PEP8 adlandırma kurallarına baktım ve tek küçük harflerle ilgili açık bir şey görmüyorum ve bunları kullanan birçok örnek görüyorum.

PEP8'de eksik olduğum bir şey mi var yoksa bu pylint'e özgü bir standart mı?

Yanıtlar:


48

PyLint yalnızca PEP8 önerilerini kontrol etmez. Ayrıca kendi önerileri de vardır, bunlardan biri değişken adının açıklayıcı olması ve çok kısa olmamasıdır.

Bu tür kısa isimlerden kaçınmak için bunu kullanabilirsiniz:

my_list.extend(x_values)

Veya PyLint'e hangi değişken adının iyi olduğunu söylemek için PyLint'in yapılandırmasını değiştirin.


10
_Geçici değerleri tutmak için kullanmak anti-modeldir. Alt çizgi değişkenleri alakasız / atılmış değerleri gösterir, iveya gibi geçici atamaları değil x. Ayrıca, tercümanda son ifadenin son değerini tutmanın özel bir anlamı vardır.
James

130

Sedyenin Alex'in not ettiği şey hakkında biraz daha ayrıntı: PyLint'e değişken isimler için istisnalar yapmasını söyleyebilirsiniz, ki bu da (yemin edersiniz) üç karakterden az olmasına rağmen tamamen nettir. Başlığın altında pylintrc dosyanıza ekleyin veya ekleyin [FORMAT]:

# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,pk,x,y

Burada pk (birincil anahtar için), x ve y eklediğim değişken isimleridir.


7
Bu en iyi cevap.
giorgiosironi

1
Görünüşe göre işe yaramıyor pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James


2
Benim gerçekten istediğim şey, anlamalarda kullanıldıklarında (istek üzerine) pylint'in kısa değişkenleri kabul etmesini sağlamaktır. Karşılaştırma return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] ve Karşılaştırma return [a for a in thing.get_customer_addresses() if a.is_proper()] , bağlamdan da anlaşılacağı üzere ikincisinin daha açık olduğunu iddia ediyorum. Genel olarak, değişken uzunluk, değişkenin kapsamı ile ilişkili olmalıdır.
EdvardM

22

Kesin yazılmış dillerde, 1 harfli isim değişkenleri ok-ish olabilir, çünkü genellikle değişkenin bildiriminde veya işlev / yöntem prototipinde adın yanındaki türü alırsınız:

bool check_modality(string a, Mode b, OptionList c) {
    ModalityChecker v = build_checker(a, b);
    return v.check_option(c);
}

Python'da, bu bilgiyi almazsınız, yani yazarsanız:

def check_modality(a, b, c):
    v = build_checker(a, b)
    return v.check_option(c)

Bakım ekibine, işlevin ne yapabileceği, nasıl adlandırıldığı ve ne döndüğü konusunda hiçbir ipucu bırakmıyorsunuz. Yani Python'da açıklayıcı isimler kullanma eğilimindesiniz:

def check_modality(name, mode, option_list):
    checker = build_checker(name, mode)
    return checker.check_option(option_list)

ve hatta malzemenin ne işe yaradığını ve hangi türlerin beklendiğini açıklayan bir belge dizesi eklersiniz.


7
"Derlenmiş diller" yerine "açıkça yazılmış" yazardım. Haskell, örneğin, derlenmiştir, ancak yine de Python'daki gibi örtük bildirimler yazabilirsiniz.
Sebastian Mach

14
Bu durumlarda sizinle aynı fikirde olsam da, bir değişken adında 3 veya daha fazla karakterin zorlanması, açıklayıcı olacağı anlamına gelmez. Şu anda kullanıyorum with open(FILE) as f: items = f.readlines(), örneğin değişkenin fgerçekten bariz olduğu yerlerde , ancak pilin uyarıları alıyorum. Bu beni flake8'e değiştirdi.
Axel Örn Sigurðsson

3
Ayrıca bir değişken adına 'f' izin vermek için kutup kurallarını değiştirebilirsiniz. İ, j AFAIR için halihazırda istisnalar vardır.
gurney alex

10
Bu yanıtı reddedenler için: Pylint'te kuralı getiren kişi benim ve bunun nedeni de tam olarak verilendir. Bu karara katılmayabilirsiniz, ancak yine de sorunun cevabı bu ...
gurney alex

1
Muhakemenizi tamamen takip ediyorum, ancak çoğu zaman algoritmalarda ve matematiksel programlamada bazı değerler tipik olarak tek harfle adlandırılır. Bence adı verilen bir işlev f, OptionListc adı verilen bir işlevden tamamen farklıdır . Özellikle de functionbir yerleşik olanı gölgelediği için adını değiştiremediğimde .
kap

19

Günümüzde regexp'i geçersiz kılma seçeneği de vardır. Örneğin, değişken olarak tek karakterlere izin vermek istiyorsanız:

pylint --variable-rgx="[a-z0-9_]{1,30}$" <filename>

Yani, pylintPEP8 ile eşleşecek ve üstüne ek ihlaller getirmeyecek. Ayrıca ekleyebilirsin .pylintrc.


3
Versiyon için > 1.8.3bu cevap gibi görünüyor. Gözlerinde farklı bu koyabilir miyim .pylintrckalıcı yapılandırma için de: variable-rgx=[a-z0-9_]{1,30}$.
James

7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" biraz daha uygun olabilir, "9" geçerli bir değişken adı olmamalıdır.
Eric Le Fort

16

Derin bir sebebi amaçladığınız hatırlamak olabilmesidir a, b, c, x, y, ve zkodunuzu yazarken anlamında, ama diğerleri, okuduktan sonra, ya da kod gel bile kodu verirken çok daha okunabilir hale gelir anlamsal bir isim. Kara tahtaya bir şeyler yazıp sonra onu silmiyoruz. On yıl veya daha uzun süre kalabilecek ve birçok kez okunabilecek bir kod yazıyoruz.

Anlamsal isimler kullanın. Ben kullandım Semantik isimler gibi olmuştur ratio, denominator, obj_generator, path, vb onları yazmak için bir saniye fazladan veya iki sürebilir, fakat zaman sonra bile yarım saat yazdıklarını anlamaya çalışırken kaydetme değer olduğunu .


7
Teşekkürler. İşte son kod - gist.github.com/amandabee/8969833 - Benim (veya sizin) bir yıl içinde okuyabileceğiniz kod hakkındaki düşüncenizi anlıyorum , ancak bu durumda, x ve y'nin gerçekten açıklayıcı olduğunu düşünüyorum.
Amanda

OTOH eğer bir XML belgesinden bir <dt /> öğesini çıkarıyorsam, onu bir değişken 'dt' içinde saklamak oldukça açık görünürken, onu 'tarih' olarak saklamak (bu öğenin temsil ettiği şeydir) kafa karıştırıcı olabilir, ve 'the_dt_field' gibi bir şey uydurmak sadece aptalca bir logore. (Hayır, öğenin adı üzerinde kontrolüm yok; bu başka birinin şeması.) Kuralı test eden bu tür birçok istisna olmalı.
Mark Wood
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.