เหตุใดผู้ตรวจสอบของ Pycharm บ่นเกี่ยวกับ“ d = {}”


196

เมื่อเริ่มต้นพจนานุกรมด้วยd = {}เครื่องมือตรวจสอบรหัสของ Pycharm จะสร้างคำเตือนว่า

การสร้างพจนานุกรมนี้สามารถเขียนใหม่เป็นตัวอักษรในพจนานุกรม

ถ้าฉันเขียนใหม่มันd = dict()เตือนจะหายไป ตั้งแต่{}อยู่แล้วเป็นตัวอักษรพจนานุกรมผมค่อนข้างมั่นใจว่าข้อความที่ผิดพลาด นอกจากนี้ดูเหมือนว่าทั้งสองd = {}และd = dict()ถูกต้องและ Pythonic

คำถามที่เกี่ยวข้องนี้ดูเหมือนจะสรุปว่าตัวเลือกเป็นเพียงเรื่องของสไตล์ / การตั้งค่า: ความแตกต่างระหว่าง "d = dict ()" และ "d = {}"

ทำไมพิชarmถึงบ่นd = {}?

UPDATE:

Mac จับมัน คำเตือนนั้นใช้กับหลายบรรทัดไม่ใช่เฉพาะคำเตือนที่ตั้งค่าสถานะ

Pycharm ดูเหมือนจะมองหาลำดับของคำสั่งที่ต่อเนื่องกันซึ่งคุณเริ่มต้นพจนานุกรมแล้วตั้งค่าในพจนานุกรม ตัวอย่างเช่นสิ่งนี้จะทริกเกอร์คำเตือน:

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

แต่รหัสนี้จะไม่:

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

2
มีเสียงดังมากเกินไปและไม่มีการเพิ่มประสิทธิภาพที่แท้จริงเพียงตรวจสอบฟุ่มเฟือยอีกครั้งหนึ่ง
dashesy

สิ่งเดียวกันเกิดขึ้นสำหรับรายการ: a = [1]; a.append (2) อาจจะเป็นเพราะ A = [1, 2] ดีกว่า ....
cleros

ได้. ข้อความที่น่ารำคาญ ขีดเส้นใต้ทั้งหมดเหล่านั้นโดย PyCharm ทำให้หนึ่งอึดอัดก่อนที่จะรันโปรแกรม
Rajkumar R

ฉันพบปัญหาที่คล้ายกันใน JetBrains YouTrack - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326และมันก็บอกว่า: ในกรณีนี้ PyCharm แนะนำว่าคุณสามารถให้คุณค่าสำหรับsomething แอตทริบิวต์ลงในตัวอักษร dict แทนที่จะกำหนด ที่บรรทัดถัดไป
Dudnikof

คำตอบ:


245

รหัสต่อไปนี้สำหรับการประกาศพจนานุกรมของคุณคืออะไร?

ฉันคิดว่า pycharm จะทำให้เกิดข้อผิดพลาดถ้าคุณมีสิ่งที่ชอบ:

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

ตามที่คุณสามารถเขียนได้

dic = {'aaa': 5}

BTW: ความจริงที่ว่าข้อผิดพลาดหายไปถ้าคุณใช้ฟังก์ชั่นไม่ได้แปลว่า pycharm เชื่อว่าdict()เป็นตัวอักษร มันอาจหมายความว่าไม่ได้บ่นว่า:

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

HTH!


6
เห็นได้ชัดว่ามันสำหรับการตรวจสอบที่มีเสียงดังที่ไม่เป็นประโยชน์ แต่น่าเสียดายที่เพื่อนร่วมงานของฉันบางคนปิดมันไปโดยสิ้นเชิงมันเป็นเรื่องที่น่าละอายเพราะมันมีประโยชน์สำหรับหลาย ๆ อย่างเช่น PEP, ... ปัญหาที่แท้จริง
dashesy

ในกรณีของฉันประเภทของการเขียนใหม่ไม่สามารถทำได้เนื่องจากรายการพจนานุกรมแต่ละรายการที่สร้างขึ้น (แต่รายการแรก) ขึ้นอยู่กับรายการพจนานุกรมก่อนหน้านี้ที่สร้างขึ้น ดังนั้นพวกเขาจะต้องได้รับมอบหมายให้พจนานุกรมทีละคนมากกว่าทุกรายการในเวลาเดียวกัน อย่างไรก็ตาม PyCharm ยังคงบ่นและบอกว่าฉันควรสร้างพจนานุกรมเป็นตัวอักษรในพจนานุกรม ฉันเดาว่าฉันต้องใช้dic = dict()วิธีแก้ปัญหา ...
HelloGoodbye

@HelloGoodbye - โดยไม่ทราบว่าปัญหาที่คุณกำลังพยายามที่จะแก้ปัญหาฉันไม่สามารถแสดงความคิดเห็นที่มีคุณภาพ แต่มีคุณพิจารณาเริ่มต้นด้วยd = { 'aaa': f1(something) }แล้วd = f2(d)แล้วd = f3(d)ฯลฯ ... หรือมิฉะนั้นd['bbb'] = f2(d), d['ccc'] = f3(d)... ?
mac

การก่อสร้างที่ฉันได้เป็นd = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b'])ฯลฯ
Hellogoodbye

5
@HelloGoodbye - ดังนั้นทำไมไม่รวมสองคนแรกเข้าด้วยกันd = {'a': A}จากนั้นก็เรียงลำดับตามที่คุณเขียนไว้?
mac

16

สิ่งนี้สามารถปิดได้ในการตั้งค่าโครงการหรือการตั้งค่าเริ่มต้น

  • ไปที่การตั้งค่า -> การตรวจสอบ -> Python
  • ยกเลิกการเลือก "การสร้างพจนานุกรมสามารถเขียนใหม่ได้ตามตัวอักษรในพจนานุกรม"

นี่คือสิ่งที่ฉันทำและสามารถยืนยันได้ว่าทำงานได้ดี รหัสของฉันคือ: payload = {** BASEPAYLOAD, ** ExtraPayload} เพื่อรวมสองพจนานุกรมและมันเกิดข้อผิดพลาด
pa1983

9

สำหรับผู้ที่ชอบ (เช่นเดียวกับฉัน) เพื่อเริ่มต้นพจนานุกรมด้วยการดำเนินการเดียว

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

แทนที่จะเป็นหลายบรรทัดเช่น

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

ในที่สุดฉันก็ลงเอยด้วยสิ่งนี้:

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

Pycharm ไม่ได้บ่นเรื่องนี้


7
ฉันประจบประแจง :( ดังนั้นคุณเพิ่มจำนวนรหัสและทำให้มันชัดเจนน้อยลงและทำงานช้าลงเพียงเพื่อกำจัดคำเตือนในโปรแกรมแก้ไขที่คุณใช้ ... ฉันไม่ใช้ pycharm แต่ฉันคิดว่ามีบางอย่าง การเรียงลำดับของการกำหนดค่าสลับที่จะปิดการใช้งานการแจ้งเตือนและช่วยให้คุณเก็บไว้ในการเข้ารหัสในทาง pythonic :).
แม็

2
@mac ฉันเห็นด้วยตอนนี้ ฉันยังเด็กและโง่) ตั้งแต่นั้นมาฉันเปลี่ยนไปเล็กน้อยแล้วปิดการใช้งานคำเตือนเหล่านั้น
Igor.K

ฮ่า ๆ! นี่จะเป็นความคิดเห็นชดเชยเวลาที่น่าจดจำที่สุดที่ฉันเคยได้รับ ;)
mac

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

สามารถสร้างพจนานุกรมได้โดยตรงโดยไม่ต้องกำหนดค่าเริ่มต้นก่อนจากนั้นกำหนดค่าใหม่ใหม่


0

ฉันมีสถานการณ์ที่คำเตือนนี้ทำให้ฉันตกนรก ในกรณีของฉันฉันเติม dict ของฉันบางส่วนเป็นตัวอักษรและบางส่วนจาก tuple output โดยฟังก์ชันเช่น:

def get_other_values():
    return 3, 4

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

ดังนั้นถ้าฉันสร้าง vars ชั่วคราวสำหรับผลลัพธ์ของ get_other_values, PEP8 สร้างคำเตือนนี้แม้ว่าฉันจะสร้าง dict ด้วยตัวอักษร และฉันไม่สามารถกำหนดปุ่ม c และ d ในสัญพจน์ได้เนื่องจากค่าเป็นเอาต์พุตเป็นทูเปิล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.