Pycharm'ın müfettişi neden “d = {}” den şikayet ediyor?


196

Bir sözlüğü d = {}Pycharm'ın kod denetçisiyle başlatırken ,

Bu sözlük oluşturma, sözlük değişmezi olarak yeniden yazılabilir.

Eğer yeniden yazarsam d = dict()uyarı kaybolur. Yana {}zaten olan bir sözlük değişmezi, emin mesajı hatalı olduğunu güzelim. Dahası, her ikisi gibi görünüyor d = {}ve d = dict()geçerli ve Pitonik.

Bu ilgili soru, seçimin sadece bir stil / tercih meselesi olduğu sonucuna varıyor: "d = dict ()" ve "d = {}" arasındaki farklar

Pycharm neden şikayet ediyor d = {}?

GÜNCELLEME:

Mac çiviledi. Uyarı, yalnızca işaretlenene değil, birden çok satıra uygulanır.

Pycharm, sözlüğü başlattığınız ve daha sonra sözlükteki değerleri ayarladığınız ardışık ifadeler dizisini arıyor gibi görünüyor. Örneğin, bu uyarıyı tetikler:

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

Ancak bu kod:

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

2
çok gürültülü ve gerçek bir performans kazancı yok, sadece bir gereksiz denetim
dashesy

Aynı şey listeler için de geçerlidir: a = [1]; a. ek (2), muhtemelen a = [1, 2] daha iyi olduğu için ....
cleros

Evet. sinir bozucu mesaj. PyCharm'ın tüm bu alt çizgileri programı çalıştırmadan önce rahatsız edersiniz.
Rajkumar R

Benzer sorunu JetBrains YouTrack'ta buldum - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 ve şöyle diyor: Bu durumda PyCharm something , atama yapmak yerine özniteliğin değerini tam olarak girmenizi önerir sonraki satırda.
Dudnikof

Yanıtlar:


245

Sözlük beyanınıza aşağıdaki kod nedir?

Eğer böyle bir şey varsa pycharm hatayı tetikleyeceğini düşünüyorum:

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

yazmış olabileceğin gibi

dic = {'aaa': 5}

BTW: İşlevi kullanırsanız hatanın ortadan kalkması, pycharm'ın dict()bir değişmez olduğuna inandığı anlamına gelmez . Bu sadece şikayet etmediği anlamına gelebilir:

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

HTH!


6
Görünüşe göre tüm bu yararlı olmayan gürültülü denetimler için maalesef bazı meslektaşlarım tamamen kapatıyor, utanç verici çünkü PEP, ..., gerçek problemler ve gerçek performans ipuçları gibi birçok şey için yararlı.
dashesy

Benim durumumda, oluşturulan her sözlük öğesi (ancak birincisi) oluşturulan önceki sözlük öğesine bağlı olduğundan, bu yeniden yazma türü mümkün değildir. Bu yüzden sözlüğe aynı anda her öğeden ziyade birer birer atanmaları gerekir. Ancak, PyCharm hala şikayet ediyor ve sözlüğü sözlük değişmezi olarak oluşturmam gerektiğini söylüyor. dic = dict()Geçici çözümü kullanmak zorundayım sanırım ...
HelloGoodbye

@HelloGoodbye - Çözmeye çalıştığınız problemi bilmeden kalifiye bir görüş ifade edemiyorum, ama d = { 'aaa': f1(something) }o d = f2(d)zamandan başlayarak d = f3(d)vs ... ya da alternatif d['bbb'] = f2(d)olarak d['ccc'] = f3(d)...?
mac

Ben inşaat d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b'])vb
Hellogoodbye

5
@HelloGoodbye - Öyleyse, neden ilk ikisini birleştirip d = {'a': A}sıralamayı özetlediğiniz gibi tutmuyorsunuz?
mac

16

Bu, Proje Ayarları'ndan veya Varsayılan Ayarlar'dan devre dışı bırakılabilir.

  • Ayarlar -> Denetimler -> Python'a gidin
  • "Sözlük oluşturma sözlük hazır bilgisi tarafından yeniden yazılabilir" seçeneğinin işaretini kaldırın

Bu yaptım ve iyi çalıştığını onaylayabilirsiniz. Benim kod: payload = {** BASEPAYLOAD, ** ExtraPayload} iki sözlük birleştirmek ve hatayı atıyordu.
pa1983

9

(tıpkı benim gibi) sözlükleri tek işlemle başlatmak isteyenler için

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

gibi birçok satır yerine

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

sonunda bununla sona erdi:

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

Pycharm bundan şikayetçi değil


7
Küfrediyorum. :( Yani, aslında kod miktarını artırdınız ve kullandığınız editörde bir uyarıdan kurtulmak için daha az net ve daha yavaş çalıştınız ... pycharm kullanmıyorum, ancak bazılarının var olduğunu varsayacağım devre dışı bırakacak ve pythonic bir şekilde kodlamaya devam etmenizi sağlayacak bir tür yapılandırma geçişi. :)
mac

2
@mac Şimdi katılıyorum. Genç ve aptaldım) o zamandan beri (biraz) değiştim ve sadece bu uyarıları devre dışı
bıraktım

Lol! Bu şimdiye kadar aldığım en unutulmaz zaman ofset yorum olmalı! ;)
mac

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

Sözlük, önce bunları başlatmadan ve sonra yeni değerleri yeniden atamadan doğrudan oluşturulabilirdi.


0

Bu uyarının beni cehenneme çevirdiği bir durum var. Benim durumumda, dict'imi kısmen değişmez olarak, kısmen de bir işlevle bir demet çıkışından dolduruyorum, şöyle:

def get_other_values():
    return 3, 4

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

Bu nedenle, get_other_values ​​çıktısı için ara değişkenler oluşturmadıkça PET8 bu uyarıyı değişmez değerlerle oluştursam bile oluşturur. Değerler bir demet olarak çıkarıldığından, c ve d tuşlarını değişmez olarak atayamam.

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.