Mengapa inspektur Pycharm mengeluh tentang "d = {}"?

195

Ketika menginisialisasi kamus dengan d = {}inspektur kode Pycharm menghasilkan peringatan, mengatakan

Pembuatan kamus ini dapat ditulis ulang sebagai kamus literal.

Jika saya menulis ulang d = dict()peringatan itu hilang. Karena {}sudah merupakan kamus literal, saya cukup yakin pesannya salah. Selain itu, sepertinya baik d = {}dan d = dict()berlaku dan Pythonic.

Pertanyaan terkait ini sepertinya menyimpulkan bahwa pilihan itu hanya masalah gaya / preferensi: perbedaan antara "d = dict ()" dan "d = {}"

Mengapa Pycharm mengeluh d = {}?

MEMPERBARUI:

Mac berhasil. Peringatan sebenarnya diterapkan ke beberapa baris, bukan hanya yang ditandai.

Pycharm tampaknya mencari urutan pernyataan berurutan di mana Anda menginisialisasi kamus dan kemudian menetapkan nilai dalam kamus. Misalnya, ini akan memicu peringatan:

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

Tetapi kode ini tidak akan:

d = {}
pass
d['a'] = 1
Chris Sears
sumber
2
terlalu berisik, dan tidak ada perolehan kinerja yang nyata, hanya satu inspeksi yang tidak perlu
dashesy
Hal yang sama terjadi pada daftar: a = [1]; a.append (2), mungkin karena a = [1, 2] lebih baik ....
cleros
ya. pesan yang mengganggu. semua yang digarisbawahi oleh PyCharm membuat orang tidak nyaman sebelum menjalankan program.
Rajkumar R
Saya menemukan masalah serupa di JetBrains YouTrack - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 dan dikatakan: Dalam kasus ini PyCharm menyarankan Anda dapat memberikan nilai untuk something atribut langsung ke dalam literal diktat alih-alih menugaskannya di baris berikutnya.
Dudnikof

Jawaban:

244

Apa kode berikut untuk deklarasi kamus Anda?

Saya pikir pycharm akan memicu kesalahan jika Anda memiliki sesuatu seperti:

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

seperti yang bisa Anda tulis

dic = {'aaa': 5}

BTW: Fakta bahwa kesalahan hilang jika Anda menggunakan fungsi tidak berarti pycharm percaya dict()itu literal. Itu bisa berarti bahwa itu tidak mengeluh untuk:

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

HTH!

Mac
sumber
6
rupanya itu untuk semua inspeksi bising yang tidak berguna ini sayangnya beberapa rekan saya mematikannya sama sekali, itu memalukan karena berguna untuk banyak hal seperti PEP, ..., masalah nyata dan petunjuk kinerja nyata.
dashesy
Dalam kasus saya, jenis penulisan ulang tidak dimungkinkan, karena setiap item kamus yang dibuat (tetapi yang pertama) tergantung pada item kamus sebelumnya yang dibuat. Jadi mereka harus ditugaskan ke kamus satu per satu daripada setiap item pada saat yang sama. Namun, PyCharm masih mengeluh dan mengatakan bahwa saya harus membuat kamus sebagai kamus literal. Saya kira saya harus menggunakan dic = dict()solusi ...
HelloGoodbye
@ HaloGoodbye - Tanpa mengetahui masalah yang Anda coba selesaikan, saya tidak bisa mengungkapkan pendapat yang berkualifikasi, tetapi apakah Anda sudah mempertimbangkan mulai dari d = { 'aaa': f1(something) }itu, d = f2(d)lalu, d = f3(d)dll ... Atau sebagai alternatif d['bbb'] = f2(d), d['ccc'] = f3(d)...?
mac
Pembangunan yang saya miliki adalah d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b']), dll
Hellogoodbye
5
@ HaloGoodbye - Jadi, mengapa tidak menggabungkan dua yang pertama dengan d = {'a': A}dan kemudian hanya menjaga urutan seperti yang Anda uraikan?
mac
15

Ini dapat dinonaktifkan di Pengaturan Proyek atau Pengaturan Default.

  • Arahkan ke Pengaturan -> Inspeksi -> Python
  • Hapus centang "Pembuatan kamus dapat ditulis ulang oleh kamus literal"
Craig Jackson
sumber
Inilah yang saya lakukan dan dapat mengonfirmasi itu berfungsi dengan baik. Kode saya adalah: payload = {** BASEPAYLOAD, ** ExtraPayload} untuk menggabungkan dua kamus dan itu membuang kesalahan.
pa1983
9

bagi mereka yang suka (sama seperti saya) untuk menginisialisasi kamus dengan operasi tunggal

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

bukannya banyak baris suka

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

pada akhirnya saya berakhir dengan ini:

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

Pycharm tidak mengeluh tentang ini

Igor.K
sumber
7
Saya merasa ngeri. :) semacam toggle konfigurasi yang akan menonaktifkan peringatan dan memungkinkan Anda untuk terus mengkode dengan cara pythonic. :)
mac
2
@ Mac Saya setuju sekarang. Saya masih muda dan bodoh) sejak itu saya telah mengubah (sedikit) dan hanya menonaktifkan peringatan itu
Igor.K
Lol! Ini harus menjadi komentar offset waktu yang paling berkesan yang pernah saya terima! ;)
mac
0
mydict = {
  a: 5,
  b:z+c/2
}

Kamus bisa dibuat secara langsung tanpa menginisialisasi mereka terlebih dahulu dan kemudian menetapkan kembali nilai-nilai baru.

Asnim P Ansari
sumber
0

Saya memiliki situasi di mana peringatan ini mengganggu saya. Dalam kasus saya, saya mengisi dict saya sebagian sebagai literal dan sebagian dari output tuple oleh suatu fungsi, seperti:

def get_other_values():
    return 3, 4

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

Jadi, kecuali saya membuat vars sementara untuk output get_other_values, PEP8 menghasilkan peringatan ini walaupun saya membuat dict dengan literal. Dan saya tidak dapat menetapkan kunci c dan d dalam literal, karena nilainya adalah output sebagai tuple.

Chris Woodfield
sumber