Tại sao pylint phản đối các tên biến ký tự đơn?


96

Tôi vẫn đang quen với các quy ước python và sử dụng pylintđể làm cho mã của mình trở nên khó hiểu hơn, nhưng tôi cảm thấy khó hiểu bởi thực tế là pylint không thích các tên biến ký tự đơn. Tôi có một vài vòng lặp như thế này:

for x in x_values:
   my_list.append(x)

và khi tôi chạy pylint, tôi nhận được Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- điều đó cho thấy rằng một tên biến hợp lệ phải dài từ 3 đến 31 ký tự, nhưng tôi đã xem qua các quy ước đặt tên PEP8 và tôi không thấy bất kỳ điều gì rõ ràng về các chữ cái thường , và tôi thấy rất nhiều ví dụ sử dụng chúng.

Có điều gì tôi đang thiếu trong PEP8 hay đây là tiêu chuẩn dành riêng cho pylint?

Câu trả lời:


47

PyLint không chỉ kiểm tra các khuyến nghị PEP8. Nó cũng có các khuyến nghị riêng, một trong số đó là tên biến phải mang tính mô tả và không quá ngắn.

Bạn có thể sử dụng điều này để tránh những tên ngắn như vậy:

my_list.extend(x_values)

Hoặc tinh chỉnh cấu hình của PyLint để cho PyLint biết tên biến nào là tốt.


10
Sử dụng _để giữ các giá trị tạm thời là phản vật chất. Biến gạch dưới chỉ ra các giá trị không liên quan / bị loại bỏ, không phải là phép gán tạm thời, chẳng hạn như ihoặc x. Hơn nữa, trong trình thông dịch, nó có ý nghĩa đặc biệt để giữ giá trị cuối cùng của biểu thức cuối cùng.
James

121

Chi tiết hơn một chút về những gì gurney alex lưu ý: bạn có thể yêu cầu PyLint đặt ngoại lệ cho các tên biến (bạn hồng hào) hoàn toàn rõ ràng mặc dù ít hơn ba ký tự. Tìm trong hoặc thêm vào tệp pylintrc của bạn , dưới [FORMAT]tiêu đề:

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

Ở đây pk (cho khóa chính), x và y là các tên biến mà tôi đã thêm.


7
Đây là câu trả lời tốt nhất.
giorgiosironi

1
Dường như không hoạt động pylint 1.8.3. pylint.pycqa.org/en/1.8/user_guide/options.html
James


2
Những gì tôi thực sự muốn là để pylint chấp nhận (theo yêu cầu) các vars ngắn khi chúng được sử dụng trong phần hiểu. So sánh return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()] với return [a for a in thing.get_customer_addresses() if a.is_proper()] tôi khẳng định cái sau rõ ràng hơn, vì một điều hiển nhiên từ ngữ cảnh. Nói chung, độ dài biến đổi phải tương quan với phạm vi của biến.
EdvardM

21

Trong các ngôn ngữ được gõ mạnh, các biến tên 1 chữ cái có thể là ok-ish, vì bạn thường nhận được kiểu bên cạnh tên trong khai báo của biến hoặc trong nguyên mẫu hàm / phương thức:

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

Trong Python, bạn không nhận được thông tin này, vì vậy nếu bạn viết:

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

bạn hoàn toàn không để lại manh mối nào cho nhóm bảo trì về chức năng có thể hoạt động như thế nào và nó được gọi như thế nào và nó trả về gì. Vì vậy, trong Python, bạn có xu hướng sử dụng tên mô tả:

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

và bạn thậm chí còn thêm một chuỗi tài liệu giải thích những gì hoạt động và những loại được mong đợi.


7
Thay vì "ngôn ngữ biên dịch", tôi sẽ viết "được đánh máy rõ ràng". Ví dụ: Haskell cũng được biên dịch, nhưng bạn có thể viết các khai báo ngầm định như trong Python.
Sebastian Mach

14
Mặc dù tôi đồng ý với bạn trong những trường hợp này, nhưng việc buộc 3 ký tự trở lên trong một tên biến không có nghĩa là nó sẽ mang tính mô tả. Tôi hiện đang sử dụng with open(FILE) as f: items = f.readlines()ví dụ, trong đó biến fthực sự rõ ràng, nhưng tôi nhận được cảnh báo pylint. Điều này khiến tôi thay đổi thành flake8.
Axel Örn Sigurðsson

3
bạn cũng có thể thay đổi các quy tắc pylint để cho phép 'f' một tên biến. Đã có ngoại lệ cho i, j AFAIR.
gurney alex

10
cho những người đã phản đối câu trả lời này: Tôi là người đưa ra quy tắc trong Pylint, và lý do chính xác là lý do được đưa ra. Bạn có thể không đồng ý với quyết định này, nhưng đây vẫn là câu trả lời cho câu hỏi ...
gurney alex

1
Tôi hoàn toàn tuân theo lý luận của bạn, tuy nhiên thường trong các thuật toán và lập trình toán học, một số giá trị thường được đặt tên bằng một chữ cái. Tôi nghĩ rằng một hàm được gọi flà hoàn toàn khác với một hàm OptionListđược gọi là c. Đặc biệt là khi tôi không thể đổi tên nó thành functionvì nó đổ bóng tích hợp sẵn.
kap

19

Ngày nay, cũng có một tùy chọn để ghi đè regexp. Tức là nếu bạn muốn cho phép các ký tự đơn làm biến:

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

Vì vậy, pylintsẽ phù hợp với PEP8 và sẽ không đưa thêm vi phạm lên đầu. Ngoài ra, bạn có thể thêm nó vào .pylintrc.


3
Đối với phiên bản > 1.8.3này dường như là câu trả lời. Có thể đặt này trong thư mục .pylintrccũng cho cấu hình vĩnh viễn: variable-rgx=[a-z0-9_]{1,30}$.
James

7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $" có thể thích hợp hơn một chút, "9" không được là tên biến hợp lệ.
Eric Le Fort

16

Lý do sâu xa hơn là bạn có thể nhớ những gì bạn dự định a, b, c, x, y, và zcó nghĩa là khi bạn viết mã của bạn, nhưng khi người khác đọc nó, hoặc ngay cả khi bạn trở về với mã của bạn, mã trở nên nhiều hơn nữa có thể đọc được khi bạn cung cấp cho nó là một tên ngữ nghĩa. Chúng tôi không viết mọi thứ một lần trên bảng đen và sau đó xóa nó. Chúng tôi đang viết mã có thể tồn tại trong một thập kỷ hoặc hơn và được đọc rất nhiều lần.

Sử dụng tên ngữ nghĩa. Tên Semantic Tôi đã sử dụng đã như ratio, denominator, obj_generator, path, vv Nó có thể mất thêm một hoặc hai thứ hai để loại chúng ra, nhưng thời gian bạn tiết kiệm cố gắng tìm ra những gì bạn đã viết, ngay cả nửa tiếng đồng hồ kể từ đó là cũng có giá trị nó .


7
Cảm ơn. Đây là mã cuối cùng - gist.github.com/amandabee/8969833 - Tôi thấy quan điểm của bạn về mã mà tôi (hoặc bạn) có thể đọc trong một năm, nhưng trong trường hợp này, tôi nghĩ x và y là mô tả thực sự.
Amanda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.