Mengapa pylint menolak nama variabel karakter tunggal?

96

Saya masih terbiasa dengan konvensi python dan menggunakan pylintuntuk membuat kode saya lebih pythonic, tapi saya bingung dengan fakta bahwa pylint tidak menyukai nama variabel karakter tunggal. Saya memiliki beberapa loop seperti ini:

for x in x_values:
   my_list.append(x)

dan ketika saya menjalankan pylint, saya mendapatkan Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- itu menunjukkan bahwa nama variabel yang valid harus antara 3 dan 31 karakter, tetapi saya telah melihat konvensi penamaan PEP8 dan saya tidak melihat sesuatu yang eksplisit mengenai satu huruf kecil , dan saya melihat banyak contoh yang menggunakannya.

Apakah ada sesuatu yang saya lewatkan di PEP8 atau apakah ini standar yang unik untuk pylint?

Amanda
sumber

Jawaban:

47

PyLint tidak hanya memeriksa rekomendasi PEP8. Ia juga memiliki rekomendasinya sendiri, salah satunya adalah bahwa nama variabel harus deskriptif dan tidak terlalu pendek.

Anda dapat menggunakan ini untuk menghindari nama pendek seperti itu:

my_list.extend(x_values)

Atau sesuaikan konfigurasi PyLint untuk memberi tahu PyLint nama variabel apa yang bagus.

warvariuc
sumber
10
Menggunakan _untuk menahan nilai-nilai sementara antipattern. Variabel garis bawah menunjukkan nilai yang tidak relevan / dibuang, bukan tugas sementara, seperti iatau x. Lebih jauh, dalam interpreter memiliki arti khusus untuk menampung nilai terakhir dari ekspresi terakhir.
Yakobus
122

Sedikit lebih detail tentang apa yang dicatat oleh brankar alex: Anda dapat memberi tahu PyLint untuk membuat pengecualian untuk nama variabel yang (Anda bersumpah kelingking) sangat jelas meskipun kurang dari tiga karakter. Temukan atau tambahkan ke file pylintrc Anda , di bawah [FORMAT]tajuk:

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

Di sini pk (untuk kunci primer), x, dan y adalah nama variabel yang telah saya tambahkan.

mlncn
sumber
7
Ini jawaban terbaik.
giorgiosironi
1
Sepertinya tidak berhasil pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James
2
Apa yang saya benar-benar ingin adalah memiliki pylint menerima (atas permintaan) vars pendek saat digunakan dalam pemahaman. Bandingkan return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] vs return [a for a in thing.get_customer_addresses() if a.is_proper()] Saya mengklaim yang terakhir lebih jelas, karena a jelas dari konteksnya. Secara umum, panjang variabel harus berkorelasi dengan ruang lingkup variabel.
EdvardM
22

Dalam bahasa yang diketik dengan kuat, variabel nama 1 huruf bisa ok-ish, karena Anda biasanya mendapatkan tipe di samping nama dalam deklarasi variabel atau dalam prototipe fungsi / metode:

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

Dengan Python, Anda tidak mendapatkan informasi ini, jadi jika Anda menulis:

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

Anda sama sekali tidak memberikan petunjuk kepada tim pemeliharaan tentang fungsi apa yang dapat dilakukan, dan bagaimana dipanggil, dan apa yang dikembalikannya. Jadi dengan Python, Anda cenderung menggunakan nama deskriptif:

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

dan Anda bahkan menambahkan docstring yang menjelaskan apa yang dilakukan barang tersebut dan jenis apa yang diharapkan.

brankar alex
sumber
7
Alih-alih "bahasa yang dikompilasi", saya akan menulis "diketik secara eksplisit". Haskell, misalnya, juga dikompilasi, namun Anda dapat menulis deklarasi implisit seperti dengan Python.
Sebastian Mach
14
Meskipun saya setuju dengan Anda dalam kasus ini, memaksa 3 atau lebih karakter dalam nama variabel tidak berarti itu akan menjadi deskriptif. Saat ini saya menggunakan with open(FILE) as f: items = f.readlines()misalnya, di mana variabelnya fsangat jelas, tetapi saya mendapatkan peringatan pylint. Ini membuat saya berubah menjadi flake8.
Axel Örn Sigurðsson
3
Anda juga dapat mengubah aturan pylint untuk mengizinkan 'f' menjadi nama variabel. Sudah ada pengecualian untuk i, j AFAIR.
brankar alex
10
untuk orang-orang yang tidak menyukai jawaban ini: Saya orang yang memperkenalkan aturan di Pylint, dan alasannya persis seperti yang diberikan. Anda mungkin tidak setuju dengan keputusan ini, namun ini adalah jawaban atas pertanyaan ...
brankar alex
1
Saya benar-benar mengikuti penalaran Anda, namun sering dalam algoritma dan pemrograman matematika beberapa nilai biasanya dinamai dengan satu huruf. Saya pikir fungsi yang dipanggil fsama sekali berbeda dari yang OptionListdipanggil c. Terutama ketika saya tidak dapat mengubah namanya menjadi functionkarena bayangan built-in.
kap
19

Saat ini juga ada opsi untuk mengganti regexp. Yaitu jika Anda ingin mengizinkan karakter tunggal sebagai variabel:

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

Jadi, pylintakan cocok dengan PEP8 dan tidak akan membawa pelanggaran tambahan di atas. Anda juga dapat menambahkannya ke .pylintrc.

Jimilian
sumber
3
Untuk versi > 1.8.3sepertinya inilah jawabannya. Dapat menempatkan ini dalam Anda .pylintrcjuga untuk konfigurasi permanen: variable-rgx=[a-z0-9_]{1,30}$.
Yakobus
7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" mungkin sedikit lebih sesuai, "9" tidak boleh menjadi nama variabel yang valid.
Eric Le Fort
16

Alasan yang lebih dalam adalah bahwa Anda mungkin ingat apa yang Anda inginkan a, b, c, x, y, dan zberarti ketika Anda menulis kode Anda, tetapi ketika orang lain membacanya, atau bahkan ketika Anda datang kembali ke kode Anda, kode menjadi jauh lebih mudah dibaca ketika Anda memberikan itu nama semantik. Kami tidak menulis sesuatu sekali di papan tulis dan kemudian menghapusnya. Kami sedang menulis kode yang mungkin bertahan selama satu dekade atau lebih, dan dibaca berkali-kali.

Gunakan nama semantik. Nama semantik Saya telah menggunakan telah seperti ratio, denominator, obj_generator, path, dll Mungkin perlu satu atau dua detik ekstra untuk mengetik mereka keluar, tapi saat Anda menyimpan mencoba untuk mencari tahu apa yang Anda tulis bahkan setengah jam dari itu adalah layak .

Aaron Hall
sumber
7
Terima kasih. Inilah kode terakhir - gist.github.com/amandabee/8969833 - Saya mengerti maksud Anda tentang kode yang saya (atau Anda) dapat baca dalam setahun, tetapi dalam kasus ini, saya pikir x dan y benar-benar deskriptif.
Amanda
OTOH jika saya mengekstrak elemen <dt /> dari dokumen XML, menyimpannya dalam variabel 'dt' tampaknya cukup jelas, sementara menyimpannya sebagai 'tanggal' (yang kebetulan diwakili oleh elemen ini) dapat membingungkan, dan membuat sesuatu seperti 'the_dt_field' hanyalah logorrhea yang konyol. (Tidak, saya tidak memiliki kendali atas nama elemen; ini adalah skema orang lain.) Harus ada banyak pengecualian yang menguji aturan tersebut.
Mark Wood