Tại sao thanh tra của Pycharm lại phàn nàn về vụ ăn d = {}?


195

Khi khởi tạo một từ điển với d = {}trình kiểm tra mã của Pycharm tạo ra một cảnh báo, nói rằng

Sáng tạo từ điển này có thể được viết lại như một từ điển.

Nếu tôi viết lại nó d = dict(), cảnh báo sẽ biến mất. Vì {}đã một từ điển theo nghĩa đen, tôi khá chắc chắn rằng thông điệp là sai. Hơn nữa, nó có vẻ như cả hai d = {}d = dict()hợp lệ và Pythonic.

Câu hỏi liên quan này dường như kết luận rằng sự lựa chọn chỉ là vấn đề về phong cách / sở thích: sự khác biệt giữa "d = dict ()" và "d = {}"

Tại sao Pycharm phàn nàn về d = {}?

CẬP NHẬT:

Mac đóng đinh nó. Cảnh báo thực sự được áp dụng cho nhiều dòng, không chỉ dòng được gắn cờ.

Pycharm dường như tìm kiếm một chuỗi các câu lệnh liên tiếp trong đó bạn khởi tạo một từ điển và sau đó đặt các giá trị trong từ điển. Ví dụ: điều này sẽ kích hoạt cảnh báo:

d = {}
d['a'] = 1

Nhưng mã này sẽ không:

d = {}
pass
d['a'] = 1

2
quá ồn ào và không có hiệu suất thực sự, chỉ cần thêm một lần kiểm tra không cần thiết
bảnh bao vào

Điều tương tự xảy ra cho các danh sách: a = [1]; a.append (2), có lẽ vì a = [1, 2] đẹp hơn ....
cleros

vâng tin nhắn phiền phức. tất cả những gạch chân của PyCharm khiến người ta không thoải mái trước khi thực hiện chương trình.
Rajkumar R

Tôi đã tìm thấy vấn đề tương tự trong JetBrains YouTrack - youtrack.jetbrains.com/su/PY-19269#u=1461253420326 và nó nói: Trong trường hợp này, PyCharm gợi ý rằng bạn có thể cung cấp giá trị cho something thuộc tính ngay trong chính tả thay vì gán nó ở dòng tiếp theo.
Dudnikof

Câu trả lời:


244

Mã sau đây để khai báo từ điển của bạn là gì?

Tôi nghĩ pycharm sẽ gây ra lỗi nếu bạn có một cái gì đó như:

dic = {}
dic['aaa'] = 5

như bạn có thể đã viết

dic = {'aaa': 5}

BTW: Thực tế là lỗi sẽ biến mất nếu bạn sử dụng chức năng không nhất thiết có nghĩa là pycharm tin dict()là theo nghĩa đen. Nó chỉ có nghĩa là nó không phàn nàn về:

dic = dict()
dic['aaa'] = 5

HTH!


6
rõ ràng là đối với tất cả các cuộc kiểm tra ồn ào không hữu ích này, thật không may, một số đồng nghiệp của tôi đã tắt nó hoàn toàn, thật đáng tiếc vì nó hữu ích cho nhiều thứ như PEP, ..., các vấn đề thực sự và gợi ý hiệu suất thực sự.
bảnh bao

Trong trường hợp của tôi, kiểu viết lại là không thể, vì mỗi mục từ điển được tạo (nhưng mục đầu tiên) phụ thuộc vào mục từ điển trước đó được tạo. Vì vậy, chúng phải được gán cho từ điển từng cái một thay vì mỗi mục cùng một lúc. Tuy nhiên, PyCharm vẫn phàn nàn và nói rằng tôi nên tạo từ điển dưới dạng từ điển. Tôi đoán tôi phải sử dụng dic = dict()cách giải quyết ...
Goodbye

@Hellooodbye - Không biết vấn đề bạn đang cố gắng giải quyết Tôi không thể đưa ra ý kiến ​​đủ điều kiện, nhưng bạn đã xem xét bắt đầu từ d = { 'aaa': f1(something) }đó d = f2(d)rồi d = f3(d)... hay cách khác d['bbb'] = f2(d), d['ccc'] = f3(d)...?
mac

Việc xây dựng tôi có là d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b'])vv
HelloGoodbye

5
@Hellooodbye - Vì vậy, tại sao không hợp nhất hai cái đầu tiên với d = {'a': A}và sau đó chỉ giữ nguyên chuỗi như bạn đã phác thảo?
mac

15

Điều này có thể bị vô hiệu hóa trong Cài đặt dự án hoặc Cài đặt mặc định.

  • Điều hướng đến Cài đặt -> Kiểm tra -> Python
  • Bỏ chọn "Tạo từ điển có thể được viết lại bằng từ điển"

Đây là những gì tôi đã làm và có thể xác nhận nó hoạt động tốt. Mã của tôi là: payload = {** BASEPAYLOAD, ** ExtraPayload} để hợp nhất hai từ điển và nó đã ném lỗi.
pa1983

9

cho những người thích (giống như tôi) để khởi tạo từ điển với thao tác đơn

d = {
  'a': 12,
  'b': 'foo',
  'c': 'bar'
}

thay vì nhiều dòng như

d = dict()
d['a'] = 12
d['b'] = ....

cuối cùng tôi đã kết thúc với điều này:

d = dict()
d.update({
  'a': 12,
  'b': 'foo',
  'c': 'bar'
})

Pycharm không phàn nàn về điều này


7
Tôi co rúm người. :( Vì vậy, bạn thực sự đã tăng số lượng mã và làm cho nó ít rõ ràng hơn và chạy chậm hơn chỉ để loại bỏ cảnh báo trong trình chỉnh sửa bạn sử dụng ... Tôi không sử dụng pycharm, nhưng tôi sẽ cho rằng có một số chuyển đổi cấu hình sẽ vô hiệu hóa cảnh báo và cho phép bạn tiếp tục mã hóa theo cách pythonic. :)
mac

2
@mac Mình đồng ý ngay. Tôi còn trẻ và ngu ngốc) kể từ đó tôi đã thay đổi (một chút) và chỉ vô hiệu hóa những cảnh báo đó
Igor.K

Cười lớn! Đây phải là bình luận bù giờ đáng nhớ nhất tôi từng nhận được! ;)
mac

0
mydict = {
  a: 5,
  b:z+c/2
}

Từ điển có thể đã được tạo trực tiếp mà không cần khởi tạo chúng trước và sau đó gán lại các giá trị mới.


0

Tôi có một tình huống mà cảnh báo này đang làm tôi thất vọng. Trong trường hợp của tôi, tôi đang đưa ra lệnh của mình một phần dưới dạng chữ và một phần từ đầu ra tuple bởi một hàm, như vậy:

def get_other_values():
    return 3, 4

foo = {
    "a": 1,
    "b": 2
}
foo["c"], foo["d"] = get_other_values()

Vì vậy, trừ khi tôi tạo các bình tạm thời cho đầu ra của get_other_values, PEP8 tạo cảnh báo này ngay cả khi tôi đang tạo ra lệnh bằng chữ. Và tôi không thể gán các khóa c và d theo nghĩa đen, vì các giá trị được xuất ra dưới dạng một tuple.

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.